UIMenuController―为UILabel添加UIMenuController

        最近做项目,项目中有一处要使用pickerView进行日期的选择,即点击textField,下方弹出的不是键盘,而是pickerView。按要求,此textField不可编辑,由于弹出pickerView取代键盘的逻辑已经写好,我只需做两件事:

  (1)去掉此textField右侧的叉号(用于点击删除整行)

   textField.clearButtonMode=UITextFieldViewNever;

  (2)禁用长按textField出现UIMenuController(选择/全选/剪切/黏贴等)

    

         

第一件事很容易,为了做成第二件事,我专门学习了一下UIMenuController的使用。这篇博文主要记录下我如何将UIMenuController和UILabel联系起来(UILabel默认没有此功能)。


 一、首先要明确的是,长按UILabel出现UIMenuController,这个功能是以UILabel为基础的,也就是为哪个控件添加此功能就以谁为基础。这里所说的基础指的是要把所涉及到的函数定义到哪个类里面。由于UILabel为系统类,所以采用Category的方式。


二、定义函数

所涉及的关键函数有2个:(override为重写的函数)

-(BOOL)canBecomeFirstResponder;//(override)一定要返回YES
-(BOOL)canPerformAction:(SEL)action withSender:(id)sender;//(override)是否允许系统UIMenuItem(选择/全选/剪切/黏贴等)生效,会被调用多次

此外,由于UILabel本身不带Gesture,所以定义:

-(void)attachLongPressGesture;//添加手势
-(void)handleLongPress;//处理手势的函数

最后,添加UIMenuController上用户点击 复制/黏贴的处理函数

-(void)copy:(id)sender;//(override)
-(void)paste:(id)sender;//(override)


三、具体函数(添加文件UILabel+Extension.h和UILabel+Extension.m)

UILabel+Extension.h:

#import <UIKit/UIKit.h>

@interface UILabel (Extension)
//为Label添加手势,定义在此处便于label直接调用
- (void)attachLongPressGesture;

@end


UILabel+Extension.m:

#import "UILabel+Extension.h"
@implementation UILabel (Extension)

/*必须允许UILabel可以成为FirstResponder*/
- (BOOL)canBecomeFirstResponder{
    return YES;
}

/*定制哪些操作生效*/
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender{
    if(action == @selector(copy:) || action ==@selector(paste:)){
        return YES;
    }
    return NO;
}

/*label会直接调用来添加手势*/
- (void)attachLongPressGesture{
    self.userInteractionEnabled=YES;//允许与用户交互
    
    UILongPressGestureRecognizer *tap=[[UILongPressGestureRecognizer alloc] initWithTarget:self
action:@selector(handleLongPress)];

    [self addGestureRecognizer:tap];//添加手势
}
/*手势处理函数*/
- (void)handleLongPress{
    if(![self becomeFirstResponder]){
        return;
    }
    UIMenuController *menu=[UIMenuController sharedMenuController];
    [menu setTargetRect:self.frame inView:self.superview];
    [menu setMenuVisible:YES animated:YES];
}

/*重写copy函数*/
- (void)copy:(id)sender{
    UIPasteboard *pasteBoard=[UIPasteboard generalPasteboard];
    pasteBoard.string=self.text;
}
/*重写paste函数*/
- (void)paste:(id)sender{
    UIPasteboard *pasteBoard=[UIPasteboard generalPasteboard];
    if(pasteBoard.string !=nil && ![pasteBoard.string isEqualToString:@""]    ){
        self.text=@"";
        self.text=pasteBoard.string;
    }
}
@end

四、使用

UILabel *testLabel=[[UILabel alloc] initWithFrame:CGRectMake(20,30, 100, 30)];
testLabel.text=@"Layne Zhang";
[testLabel attachLongPressGesture];//添加手势

这样,长按testLabel就会出现UIMenuController,且只有Copy和Paste,Copy和Paste也有相应的功能。

你可能感兴趣的:(UILabel)