iOS开发系列--UITouch与UITapGestureRecognizer的冲突

由于项目需求,在一个UIView中使用了富文本M80AttributedLabel控件,底层UIView上添加一个UITapGestureRecognizer单击事件,用于点击空白处收起键盘。
M80AttributedLabel中使用了一个Link跳转,控件内部使用的是UITouch来做处理的,刚开始调试发现怎么点都无法触发M80AttributedLabelLink跳转,后来对UITouch事件进行断点跟踪,发现

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

事件无法正确执行,而是在

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event

事件中就中断了。
经过资料查询,最后发现是因为底层UIView加了UITapGestureRecognizer
而这个手势导致了touchesCancelled被触发从而使触摸失效。

解决办法:
1.通过设置UITapGestureRecognizercancelsTouchesInView属性。
cancelsTouchesInView的官方描述是“A Boolean value affecting whether touches are delivered to a view when a gesture is recognized.”也就是说,可以通过设置这个布尔值,来设置手势被识别时触摸事件是否被传送到视图。
当值为YES的时候,系统会识别手势,并取消触摸事件;为NO的时候,手势识别之后,系统将触发触摸事件。

gestureRecognizer.cancelsTouchesInView = NO;

2.移除底层UIViewUITapGestureRecognizer事件,添加一个UIButton,通过UIButtonUIControlEventTouchUpInside来实现同样的点击空白处收起键盘。

相关推荐