美文网首页iOSiOS移动开发iOS系统框架
你见过却不知道的UIMenuController

你见过却不知道的UIMenuController

作者: Andyzhao | 来源:发表于2015-09-02 00:44 被阅读2158次

    前言:最近一段时间都在做项目,写博客很少,这几天会把项目中遇到的一些小知识点总结分享给大家.

    先看一下图,苹果自带的UIMenuController都在什么地方
    • UITextFiled
    UITextFiled.png
    • UITextView
    UITextView.png
    • UIWebView
    UIWebView.png
    • 由以上3张图可以看出UITextFiled,UITextView,UIWebView,在这几个控件上点击时都能够弹出UIMenuController,以便我们实现拷贝,粘贴等功能, 但我们在实际开发过程中有可能有这样的需求,如下图
    cell.png
    • 大家都知道, cell不具备以上功能的,需要我们自己实现这种需求,下面为了方便演示,我对前三张图片中的UILable实现上述功能.

    • 要让UILable实现上述功能我们需要对UILable进行重写,代码如下;

    #import "ZHLable.h"
    
    @implementation ZHLable
    
    - (void)awakeFromNib
    {
        // 给lable添加手势
        [self addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(labelClick)]];
    }
    
    /**
     *  label可以成为第一响应者
     */
    - (BOOL)canBecomeFirstResponder
    {
        return YES;
    }
    
    /**
     *  监听label点击
     */
    - (void)labelClick
    {
        // 成为第一响应者
        [self becomeFirstResponder];
        
        // 弹出MenuController
        UIMenuController *menu = [UIMenuController sharedMenuController];
        // 设置显示的范围
        //    [menu setTargetRect:self.bounds inView:self];
        [menu setTargetRect:self.frame inView:self.superview];
        [menu setMenuVisible:YES animated:YES];
    }
    
    /**
     *  这个方法决定了MenuController的菜单项内容
     *  返回YES,就代表MenuController会有action菜单项
     */
    - (BOOL)canPerformAction:(SEL)action withSender:(id)sender
    {
        if (action == @selector(cut:)
            || action == @selector(copy:)
            || action == @selector(paste:)) return YES;
        return NO;
    }
    
    #pragma mark - 菜单点击处理
    - (void)cut:(UIMenuController *)menu
    {
        // 将当前label的文字设置到粘贴板
        [UIPasteboard generalPasteboard].string = self.text;
        
        // 清空文字
        self.text = nil;
    }
    
    - (void)copy:(UIMenuController *)menu
    {
        // 将当前label的文字设置到粘贴板
        [UIPasteboard generalPasteboard].string = self.text;
    }
    
    - (void)paste:(UIMenuController *)menu
    {
        // 将粘贴板的文字设置到当前label上
        self.text = [UIPasteboard generalPasteboard].string;
    }
    
    @end
    
    
    
    • OK,这样我们实现了上述功能, 如下图:
    lable.png
    上述实现过程也不是很难,关键是大家需要知道有这个功能,当项目有这样的需求知道怎么做就行

    注: 上面整个示例过程可能对于初学者可能还存在以下问题

    • (一)语言问题:
    语言问题.png

    解决方法:

    语言解决.png
    • (二)UILable默认不能与用户交互
    @property(nonatomic,getter=isUserInteractionEnabled) BOOL userInteractionEnabled;  // default is NO
    

    解决方法:
    1⃣️
    lable.userInteractionEnabled = YES;
    2⃣️

    交互.png

    相关文章

      网友评论

      • nicodeng:请问怎么样让menu和键盘gong c w
      • VV木公子:请博主提供demo或者源码链接
      • ryugaku:马克了
      • ddaa8dae50b0:谢谢分享
      • Zander:大神,交互设计师一枚,初学Xcode,有一点前端基础,推荐一些初级教程

      本文标题:你见过却不知道的UIMenuController

      本文链接:https://www.haomeiwen.com/subject/gmrlcttx.html