默认支持的控件有
- UITextField
- UITextView
- UIWebView
让其他控件也支持
以UILabel为例演示如何让其他控件支持UIMenuController。
1. 自定义MenuLabel
让其继承自UILabel
。
2. 在初始化方法中设置:允许Label交互,并添加单击手势.
self.userInteractionEnabled = YES;
[self addGestureRecognizer:[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapClick)]];
3. 显示 UIMenuController。
//实现单击方法
- (void)tapClick
{
//让Label成为第一响应者
[self becomeFirstResponder];
UIMenuController *menu = [UIMenuController sharedMenuController];
/**
* 参数说明
* targetRect: UIMenuController 要指向的矩形框
* targetView: targetRect 会以targetView的左上角为坐标原点
*/
[menu setTargetRect:self.bounds inView:self];
[menu setMenuVisible:YES animated:YES];
}
重写canBecomeFirstResponder
方法,让label有资格成为第一响应者。
- (BOOL)canBecomeFirstResponder
{
return YES;
}
为什么要成为第一响应者?因为UIMenuController的显示是需要参考第一响应者的,当一个控件不再是第一响应者的时候,它叫出来的UIMenuController也会随之消失。而且,UIMenuController要实现哪些方法,那些方法的具体实现,都会去询问第一响应者。
到目前为止,还不能正常显示出UIMenuController,因为它还不知道要实现哪些方法。所以需要重写canPerformAction: withSender:
来告诉它。可以顺便打印出来,看它默认支持哪些方法。
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
NSLog(@"%@",NSStringFromSelector(action));
return YES;
}
效果大概如下
4. 过滤方法,只保留我们需要的。
如果我们只想要剪切、复制、粘贴,可以在canPerformAction: withSender:
方法中过滤一下。从之前的打印的方法中我们知道剪切、复制、粘贴分别对应cut:
、copy:
、paste:
。
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
if (action == @selector(cut:) || action == @selector(paste:) || action == @selector(copy:)) {
return YES;
}
return NO;
}
5. 最后一步就是实现方法了。如果我们想要实现剪切、复制、粘贴这几个功能,就需要实现相应的方法。
- (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;
}
最后效果如下
自定义UIMenuController上的item
虽然系统提供的功能挺全的,但不满足怎么办?这个时候我们可以定制我们自己的Item。
- (void)tapClick
{
[self becomeFirstResponder];
UIMenuController *menu = [UIMenuController sharedMenuController];
//在menu显示前添加几个自定义的Item
UIMenuItem *zanItem = [[UIMenuItem alloc]initWithTitle:@"赞" action:@selector(zan:)];
UIMenuItem *shareItem = [[UIMenuItem alloc]initWithTitle:@"分享" action:@selector(share:)];
//设置menuItems
menu.menuItems = @[zanItem,shareItem];
[menu setTargetRect:self.bounds inView:self];
[menu setMenuVisible:YES animated:YES];
}
再实现 zan:
和 share:
两个方法。
- (void)zan:(UIMenuController *)menu
{
NSLog(@"赞");
}
- (void)share:(UIMenuController *)menu
{
NSLog(@"分享");
}
最后再通过canPerformAction: withSender:
方法告诉UIMenuController实现了这两个方法。
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
if (action == @selector(zan:) || action == @selector(share:)) {
return YES;
}
return NO;
}