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

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

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

事件没法正确执行,而是在调试

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

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

解决办法:
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来实现一样的点击空白处收起键盘。it

相关文章
相关标签/搜索