-
解决的场景是:
collectionView与外层View事件冲突,在外层View上添加了整体事件,然后在collectionView的协议方法didSelectItemAtIndexPath里也写了item的点击事件。
会发现item的点击事件被屏蔽,只会响应外层View的手势事件。
示意图.png
解决办法
1,遵守协议UIGestureRecognizerDelegate
2,给外层View添加手势,设置代理
UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didClickView)];
tapGestureRecognizer.delegate = self;
[self.collectionview addGestureRecognizer:tapGestureRecognizer];
3,利用手势的代理方法进行判断,如果手势执行的视图不是需要的视图就不让其执行(这时点击item就会响应自身的方法)
主要用到的协议方法是shouldReceiveTouch
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
if ([NSStringFromClass([touch.view class]) isEqualToString:@"_UITableViewHeaderFooterContentView"]) {
return YES;
}
return NO;
}
- 其中
关于手势所在视图的判断,因写法(类引用格式)而异,可能有:
touch.view != self.collectionView
[[touch.view] isKindOfClass:[UIView class]]
或者直接如上代码片断中判断:
[NSStringFromClass([touch.view class]) isEqualToString:@"_UITableViewHeaderFooterContentView"]
其中class名字可以从Xcode中的Debug View Hierarchy中查看。
网友评论