美文网首页iOS Developer
UIMenuController的使用(一)

UIMenuController的使用(一)

作者: Paulpang | 来源:发表于2016-10-15 22:06 被阅读145次
    今天遇到一个这样的需求:

    在点击UILabel的时候,会弹出来一个类似于下图的效果:

    Paste_Image.png
    第一次看到这个需求的时候,真的是一脸懵逼,在自己的印象中UILabel从来没有这种属性,最后经过一天的网上查找资料,发现之所以能够弹出这个框,是因为调用了UIMenuController,于是乎就开始写Demo来测试.

    下面介绍一下UIMenuController的用法:

    • 默认情况下,有一下控件已经支持UIMenuController
      - UITextField
      - UITextView
      - UIWebView

    但是UILabel不支持UIMenuController,为了让UILabel也支持,这时候需要自定义UILabel;

    • 在.h文件
        #import <UIKit/UIKit.h>
        @interface XJLabel : UILabel
        @end
    
    • 在.m文件
          #import "XJLabel.h"
          @implementation XJLabel
    
          - (void)awakeFromNib {
              [super awakeFromNib];
              [self setup];
            }
    
          - (instancetype)initWithFrame:(CGRect)frame  {
                if (self = [super initWithFrame:frame]) {
                      [self setup];
                }
                return self;
          }
          - (void)setup  {
                self.userInteractionEnabled = YES;
                [self addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(labelClick)]];
            }
          /**
           * 让label有资格成为第一响应者
           */
          - (BOOL)canBecomeFirstResponder  {
              return YES;
            }
          /**
           * label能执行哪些操作(比如copy, paste等等)
           * @return  YES:支持这种操作
           */
            - (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
               
               if (action == @selector(cut:) || action == @selector(copy:) || action == @selector(paste:)) return YES;  
                return NO;
          }
    
            - (void)cut:(UIMenuController *)menu {
                // 将自己的文字复制到粘贴板
                [self copy:menu];
                // 清空文字
                 self.text = nil;
          }
          - (void)copy:(UIMenuController *)menu  {
              // 将自己的文字复制到粘贴板
              UIPasteboard *board = [UIPasteboard generalPasteboard];
              board.string = self.text;
           }
            - (void)paste:(UIMenuController *)menu {
              // 将粘贴板的文字 复制 到自己身上
              UIPasteboard *board = [UIPasteboard generalPasteboard];
              self.text = board.string;
          }
    
          - (void)labelClick  {
              // 1.label要成为第一响应者(作用是:告诉UIMenuController支持哪些操作, 这些操作如何处理)
              [self becomeFirstResponder];
        
              // 2.显示MenuController
              UIMenuController *menu = [UIMenuController sharedMenuController];
              // targetRect: MenuController需要指向的矩形框
              // targetView: targetRect会以targetView的左上角为坐标原点
              [menu setTargetRect:self.bounds inView:self];
          //    [menu setTargetRect:self.frame inView:self.superview];
              [menu setMenuVisible:YES animated:YES];
          }
    
          @end
    
    用自定义UILabel以后,显示出来的效果图如下:
    Snip20161015_4.png

    但是这还不是需求要的效果:

    Paste_Image.png

    这和需求要的效果还有一点差距,所以用系统的UIMenuController显然是不行,所以这时候要自定义UIMenuController,具体的实现方法在下一篇文章来实现, 如果感觉文章对大家有帮助,请点个赞,我会继续努力.......

    相关文章

      网友评论

        本文标题:UIMenuController的使用(一)

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