前言
以UITableViewCell进行介绍,其他的控件,UILabel,UITextField都是类似的。我们这里是自定义的Cell。
UIResponder
要实现类似下面这个效果,就要重写UIResponder的两个方法。
- -(BOOL)canBecomeFirstResponder
- -(BOOL)canPerformAction:(SEL)action withSender:(id)sender
第一个方法表示,表示当触发UIMenuController的时候,该控件可以响应。第二个方法是指定UIMenuController显示什么功能,该例子中显示的是“回复”,“举报”和“复制”。
OK,一般我们都是长按某个控件来进行触发的,长按的手势是UILongPressGestureRecognizer
具体的添加方法就不叙述。
将手势添加到CustomeCell.m中,并增加一个UIMenuController属性。
- (UIMenuController *)menuController {
if (!_menuController) {
_menuController = [UIMenuController sharedMenuController];
UIMenuItem *replyItem = [[UIMenuItem alloc] initWithTitle:@"回复" action:@selector(replyAction:)];
UIMenuItem *reportItem = [[UIMenuItem alloc] initWithTitle:@"举报" action:@selector(reportAction:)];
UIMenuItem *copyItem = [[UIMenuItem alloc] initWithTitle:@"复制" action:@selector(copyAction:)];
[_menuController setMenuItems:[NSArray arrayWithObjects:replyItem,reportItem,copyItem, nil]];
}
return _menuController;
}
上面代码中,replyAction,reportAction和copyAction都是自定义的方法。
长按手势代码如下:
- (void)popMenu:(UIGestureRecognizer *)guesture {
[self becomeFirstResponder];
[self.menuController setTargetRect:self.frame inView:self.superview];
//调整"self.frame"来指定menu的显示位置。
[self.menuController setMenuVisible:YES animated:YES];
}
最后别忘记重写UIResponder中的两个方法
- (BOOL)canBecomeFirstResponder {
return YES;
}
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
if (action == @selector(replyAction:)) {
return YES;
}
if (action == @selector(reportAction:)) {
return YES;
}
if (action == @selector(copyAction:)) {
return YES;
}
return NO;
}
后记
凡是继承与UIResponder的控件都可以实现UIMenuController的功能。
有任何问题可扫描下列二维码