比如,在UITableViewCell 中,我们要实现长按选择置顶或者删除,效果图如下:
这个时候就要用到 UIMenuController。
UIMenuController
要用UIMenuController 必须实现下面三个方法
//是否可以成为第一响应
-(BOOL)canBecomeFirstResponder{
return YES;
}
//是否可以接收某些菜单的某些交互操作
-(BOOL)canPerformAction:(SEL)action withSender:(id)sender{
return YES;
}
//menu所处的view必须成为第一响应
[self becomeFirstResponder];
先要实现UIMenuItem的响应事件。
UIMenuItem *item1 = [[UIMenuItemalloc]initWithTitle:@"Flag"action:@selector(one:)];
然后要唤醒UIMenuController:
//设置菜单显示的位置 frame设置其文职 inView设置其所在的视图(即定位)
[[UIMenuController sharedMenuController] setTargetRect:frame inView:self.view];
//将菜单控件设置为可见(即展示)
[UIMenuController sharedMenuController].menuVisible = YES;
在UITableViewCell中的使用
1.cell默认是无法成为responder, 所以menu所在的cell 的定义文件(cell.m)重写-(BOOL)canBecomeFirstResponder;方法。
- (BOOL)canBecomeFirstResponder{
return YES;
}
2.在tableview的cellForRowAtIndexPath 中,cell的初始化之后添加长按手势
//添加长按手势
UILongPressGestureRecognizer *longPressGesture = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(cellLongPress:)];
[priceCell addGestureRecognizer:longPressGesture];
- (void)cellLongPress:(UIGestureRecognizer *)recognizer实现
- #pragma mark - 长按手势事件
- (void)cellLongPress:(UIGestureRecognizer *)recognizer{
if (recognizer.state == UIGestureRecognizerStateBegan) {
CGPoint location = [recognizer locationInView:self.tableView];
//_longGestureIndexPath是全局变量,用来存放当前手势所在的cell的indexPath 方便后面的置顶和删除
_longGestureIndexPath = [self.tableView indexPathForRowAtPoint:location];
PPStockPriceTableViewCell *cell = (PPStockPriceTableViewCell *)recognizer.view;
//这里把cell做为第一响应(cell默认是无法成为responder,需要重写canBecomeFirstResponder方法)
[cell becomeFirstResponder];
UIMenuController *menuController = [UIMenuController sharedMenuController];
//控制箭头方向
menuController.arrowDirection = UIMenuControllerArrowDefault;
//自定义事件
UIMenuItem *topItem = [[UIMenuItem alloc] initWithTitle:@"置顶" action:@selector(menuTopBtnPressed:)];
UIMenuItem *delItem = [[UIMenuItem alloc] initWithTitle:@"删除" action:@selector(menuDelBtnPressed:)];
NSArray *menuItemArray = [NSArray arrayWithObjects:topItem, delItem,nil];
[menuController setMenuItems:menuItemArray];
[menuController setTargetRect:cell.frame inView:self.tableView];
[menuController setMenuVisible:YES animated:YES];
}
}
3.实现-(BOOL)canPerformAction:(SEL)action withSender:(id)sender方法。
-(BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
return action==@selector(menuDelBtnPressed:) || action==@selector(menuTopBtnPressed:);
}
然后就是在- (void)menuTopBtnPressed : (id)sender;方法中实现置顶, 在- (void)menuDelBtnPressed: (id)sender; 方法中实现删除。 由于这里是置顶和删除,要对数据源进行处理,所以前面的全局变量_longGestureIndexPath就可以在这两个方法中用上了。