征服iOScell长按手势

长按UITableViewCell自定义菜单

2016-09-20  本文已影响1080人  helloxiaogui

比如,在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就可以在这两个方法中用上了。

上一篇下一篇

猜你喜欢

热点阅读