您的位置:首页 > 产品设计 > UI/UE

UIMenuController—为UILabel添加UIMenuController

2015-07-30 23:12 561 查看
最近做项目,项目中有一处要使用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也有相应的功能。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息