UIMenuController—为UILabel添加UIMenuController
2015-07-30 23:12
561 查看
最近做项目,项目中有一处要使用pickerView进行日期的选择,即点击textField,下方弹出的不是键盘,而是pickerView。按要求,此textField不可编辑,由于弹出pickerView取代键盘的逻辑已经写好,我只需做两件事:
(1)去掉此textField右侧的叉号(用于点击删除整行)
第一件事很容易,为了做成第二件事,我专门学习了一下UIMenuController的使用。这篇博文主要记录下我如何将UIMenuController和UILabel联系起来(UILabel默认没有此功能)。
一、首先要明确的是,长按UILabel出现UIMenuController,这个功能是以UILabel为基础的,也就是为哪个控件添加此功能就以谁为基础。这里所说的基础指的是要把所涉及到的函数定义到哪个类里面。由于UILabel为系统类,所以采用Category的方式。
二、定义函数
所涉及的关键函数有2个:(override为重写的函数)
三、具体函数(添加文件UILabel+Extension.h和UILabel+Extension.m)
UILabel+Extension.h:
UILabel+Extension.m:
(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也有相应的功能。
相关文章推荐
- IOS 7.1 兼容性bug 问题,UIButton,UILabel ...
- UILabel的学习
- UILabel
- label指定位置文字属性设置
- 倒计时
- 第一个IOS程序(代码版)
- UILabel自动换行,自适应高度
- iOS开发——UILabel自动换行及高度自适应UILabel自动换行及高度自适应
- 【学习中的分享】 iOS利用UILabel和UIButton制作一个简单的计算器
- 初学iOS UI 用于交流与学习
- iOS UI 第二课 UITextField UIButton
- UILabel根据字符串长度获取大小,设置Frame
- uilabel字符串的宽高度
- iOS中怎么获取UILabel的高度
- UILabe 自适应宽高
- IOS 自定义流式LabelView
- iOS UILabel的基本用法
- iOS7中UILabel根据内容自动调整高度
- iOS UI Label控件
- UILabel基础语法