你见过却不知道的UIMenuController
前言:最近一段时间都在做项目,写博客很少,这几天会把项目中遇到的一些小知识点总结分享给大家.
先看一下图,苹果自带的UIMenuController都在什么地方
UITextFiled
UITextFiled.png
UITextView
UITextView.png
UIWebView
UIWebView.png
由以上3张图可以看出UITextFiled,UITextView,UIWebView,在这几个控件上点击时都能够弹出UIMenuController,以便我们实现拷贝,粘贴等功能, 但我们在实际开发过程中有可能有这样的需求,如下图
cell.png
大家都知道, cell不具备以上功能的,需要我们自己实现这种需求,下面为了方便演示,我对前三张图片中的UILable实现上述功能.
要让UILable实现上述功能我们需要对UILable进行重写,代码如下;
#import"ZHLable.h"@implementationZHLable- (void)awakeFromNib{// 给lable添加手势[selfaddGestureRecognizer:[[UITapGestureRecognizeralloc] initWithTarget:selfaction:@selector(labelClick)]];}/**
* label可以成为第一响应者
*/- (BOOL)canBecomeFirstResponder{returnYES;}/**
* 监听label点击
*/- (void)labelClick{// 成为第一响应者[selfbecomeFirstResponder];// 弹出MenuControllerUIMenuController*menu = [UIMenuControllersharedMenuController];// 设置显示的范围// [menu setTargetRect:self.bounds inView:self];[menu setTargetRect:self.frameinView:self.superview]; [menu setMenuVisible:YESanimated:YES];}/**
* 这个方法决定了MenuController的菜单项内容
* 返回YES,就代表MenuController会有action菜单项
*/- (BOOL)canPerformAction:(SEL)action withSender:(id)sender{if(action ==@selector(cut:) || action ==@selector(copy:) || action ==@selector(paste:))returnYES;returnNO;}#pragma mark - 菜单点击处理- (void)cut:(UIMenuController*)menu{// 将当前label的文字设置到粘贴板[UIPasteboardgeneralPasteboard].string=self.text;// 清空文字self.text=nil;}- (void)copy:(UIMenuController*)menu{// 将当前label的文字设置到粘贴板[UIPasteboardgeneralPasteboard].string=self.text;}- (void)paste:(UIMenuController*)menu{// 将粘贴板的文字设置到当前label上self.text= [UIPasteboardgeneralPasteboard].string;}@end
OK,这样我们实现了上述功能, 如下图:
lable.png
上述实现过程也不是很难,关键是大家需要知道有这个功能,当项目有这样的需求知道怎么做就行
注: 上面整个示例过程可能对于初学者可能还存在以下问题
(一)语言问题:
语言问题.png
解决方法:
语言解决.png
(二)UILable默认不能与用户交互
@property(nonatomic,getter=isUserInteractionEnabled)BOOLuserInteractionEnabled;// default is NO
解决方法:
1⃣️
lable.userInteractionEnabled = YES;
2⃣️
交互.png