iOS控制点击事件优先级|8月更文挑战
原创
©著作权归作者所有:来自51CTO博客作者#公众号:iOS逆向的原创作品,请联系作者获取转载授权,否则将追究法律责任
前言
原理:利用cancelsTouchesInView属性,控制点击事件优先级
场景:比如筛选视图,监听蒙版的点击事件就隐藏筛选视图。优先处理筛选视图的cell选中事件。

I 、设置tableView的点击事件优先级低于cell的选中事件
利用cancelsTouchesInView属性进行实现
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];
II 、其他方式控制事件的传递
-
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- (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
demo2的内容是:将水平方向弹出菜单视图集成到VC的View
疑问解答,请关注公众号:iOS逆向
1.支持展开折叠的弹出菜单的实现思路:
1.1将弹出视图添加到keyWindow,蒙版也添加到主窗口(主要原因是点击屏幕的空白处,需要隐藏弹出视图)
1.2展示的时候,动画从右上角往左下脚延伸;隐藏的时候,动画从左下脚往右上角收回 (展示的时候,从上往下,即x,y 慢慢变大)
1.3 内部视图采用collectionView进行布局
1.4 view的frame 是根据当前点击的菜单按钮所在的商品cell进行计算和坐标转换的。