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
来实现同样的点击空白处收起键盘。