美文网首页征服iOScell长按手势
长按UITableViewCell自定义菜单

长按UITableViewCell自定义菜单

作者: helloxiaogui | 来源:发表于2016-09-20 11:32 被阅读1080次

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

    相关文章

      网友评论

        本文标题:长按UITableViewCell自定义菜单

        本文链接:https://www.haomeiwen.com/subject/srynettx.html