iOS小技能:设置tableView的点击事件优先级低于cell的选中事件

3,101 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第30天,点击查看活动详情

前言

原理:利用cancelsTouchesInView属性,控制点击事件优先级

I 设置tableView的点击事件优先级低于cell的选中事件

1.1 应用场景

场景1:比如筛选视图,监听蒙版的点击事件就隐藏筛选视图。优先处理筛选视图的cell选中事件。

在这里插入图片描述

场景2:商品列表的商品点击事件,设置低于右侧的操作按钮的点击事件

在这里插入图片描述

1.2 利用cancelsTouchesInView属性进行实现

案例1:tableView的UITapGestureRecognizer的优先级低于cell的选中事件

    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] init];
    [[tap rac_gestureSignal] subscribeNext:^(id x) {
        @strongify(self);
        if (self.alpha) {
            [self.viewModel.hiddenSubject sendNext:nil];
        }
    }];
    [self addGestureRecognizer:tap];
    
    UITapGestureRecognizer *cutTap = [[UITapGestureRecognizer alloc] init];
    cutTap.cancelsTouchesInView = NO;// 设置tableView的点击事件优先级,低于cell的选中事件
    [[cutTap rac_gestureSignal] subscribeNext:^(id x) {
        //        @strongify(self);
        [self.viewModel.hiddenSubject sendNext:nil];

    }];
    [self.tableView addGestureRecognizer:cutTap];

案例2:cell的选中事件低于按钮的点击事件

    self.contentView.backgroundColor = kViewColor;
    
    
    UITapGestureRecognizer *cutTap = [[UITapGestureRecognizer alloc] init];
    
                            cutTap.cancelsTouchesInView = NO;// 设置V的点击事件优先级,低于cell的选中事件

    
    [[cutTap rac_gestureSignal] subscribeNext:^(id x) {
        
        NSLog(@" cutTap 点击了cell ");
        if ( self.models.block) {
            self.models.block(self.models);
        }
    }];
    [self.contentView addGestureRecognizer:cutTap];
    
    

按钮的点击事件推荐也用addGestureRecognizer:实现。

1.3 其他方式控制事件的传递

  • UIview的 hitTest: withEvent:
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
    
    if (point.y<0) {
        return [super hitTest:point withEvent:event];
    }
    
    return self;
}


  • 交给子视图处理事件
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
    

    
        CGPoint redBtnPoint = [self convertPoint:point toView:self.contentView];
    
   
    
        if ( CGRectContainsPoint(_imgViewdel.frame, redBtnPoint) ) {
            return _imgViewdel;
        }
    
    
    
//    _imgView
        return [super hitTest:point withEvent:event];
}

  • gestureRecognizer代理方式
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{

 if ([touch.view isKindOfClass:[UITextField class]])

    {

        return NO;

    }

    // 若为UITableViewCellContentView(即点击了tableViewCell),则不截获Touch事件

    if ([NSStringFromClass([touch.view class]) isEqualToString:@"UITableViewCellContentView"]) {

        return NO;

    }

    return YES;

}


II、see aslo

iOS Horizontal Popup View 【 水平方向弹出菜单视图】例子:商品列表支持弹出菜单进行下/上架商品、打印商品价签、编辑商品信息、同步网店等操作popover

视频:live.csdn.net/v/173757

demo1下载地址:download.csdn.net/download/u0…

demo 设置两个测试开关 :

测试开关1:将水平方向弹出菜单视图集成到cell

测试开关2:将水平方向弹出菜单视图集成到VC的View

demo2下载地址:download.csdn.net/download/u0…

demo2的内容是:将水平方向弹出菜单视图集成到VC的View

疑问解答,请关注公众号:iOS逆向

1.支持展开折叠的弹出菜单的实现思路:

1.1将弹出视图添加到keyWindow,蒙版也添加到主窗口(主要原因是点击屏幕的空白处,需要隐藏弹出视图)

1.2展示的时候,动画从右上角往左下脚延伸;隐藏的时候,动画从左下脚往右上角收回 (展示的时候,从上往下,即x,y 慢慢变大)

1.3 内部视图采用collectionView进行布局

1.4 view的frame 是根据当前点击的菜单按钮所在的商品cell进行计算和坐标转换的。

———————————————— 版权声明:本文为CSDN博主「#公众号:iOS逆向」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:blog.csdn.net/z929118967/…