iOS开发系列--UITouch与UITapGestureRecognizer的冲突
由于项目需求,在一个UIView中使用了富文本M80AttributedLabel控件,底层UIView上添加一个UITapGestureRecognizer单击事件,用于点击空白处收起键盘。M80AttributedLabel中使用了一个Link跳转,控件内部使用的是UITouch来做处理的,刚开始调试发现怎么点都无法触发M80AttributedLabel的Link跳转,后来对UITouch事件进行断点跟踪,发现
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
事件无法正确执行,而是在
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
事件中就中断了。
经过资料查询,最后发现是因为底层UIView加了UITapGestureRecognizer
而这个手势导致了touchesCancelled被触发从而使触摸失效。
解决办法:
1.通过设置UITapGestureRecognizer 的cancelsTouchesInView属性。cancelsTouchesInView的官方描述是“A Boolean value affecting whether touches are delivered to a view when a gesture is recognized.”也就是说,可以通过设置这个布尔值,来设置手势被识别时触摸事件是否被传送到视图。
当值为YES的时候,系统会识别手势,并取消触摸事件;为NO的时候,手势识别之后,系统将触发触摸事件。
gestureRecognizer.cancelsTouchesInView = NO;
2.移除底层UIView的UITapGestureRecognizer事件,添加一个UIButton,通过UIButton的UIControlEventTouchUpInside来实现同样的点击空白处收起键盘。