美文网首页
iOS解决UITextView 长按手势冲突

iOS解决UITextView 长按手势冲突

作者: jiezheng | 来源:发表于2017-03-23 12:44 被阅读0次

想给UITextView添加一个功能,长按呼出新的界面。

恩,开始干吧!

首先先创建一个长按手势。

UILongPressGestureRecognizer *longPress =[[UILongPressGestureRecognizer alloc] initWithTarget:selfaction:@selector(longBangClick:)];

[self.textView addGestureRecognizer:bangPress];

添加后,长按响应,哎呦不错哦!

不对,UITextView获取焦点后,怎么再进行长按只出放大镜了👀!就知道事情没那么简单!

分析一下吧:

    在TextView没有获取到焦点时,事件能够响应,获取到焦点后无法响应,因此初步怀疑是GestureRecognizer事件冲突,因此:

for(UIGestureRecognizer *recognizer in self.textView.gestureRecognizers) {

NSLog(@"%@",[recognizer class]);

}

2017-03-24 09:42:10.521927 Medicare[9494:1168221] UIScrollViewDelayedTouchesBeganGestureRecognizer

2017-03-24 09:42:10.522073 Medicare[9494:1168221] UIScrollViewPanGestureRecognizer

2017-03-24 09:42:10.522147 Medicare[9494:1168221] UITextTapRecognizer

2017-03-24 09:42:10.522213 Medicare[9494:1168221] UITapAndAHalfRecognizer

2017-03-24 09:42:10.522271 Medicare[9494:1168221] UITextTapRecognizer

2017-03-24 09:42:10.522405 Medicare[9494:1168221] UIVariableDelayLoupeGesture

什么鬼...  不管,先分析下吧,前两个是ScrollView的事件,下面四个类名都找不到,应该是私有方法,想自定义就无望了。但是根据类名UITextTapRecognizer,UITapAndAHalfRecognizer 判断这两个应该跟属于点击手势。

for(UIGestureRecognizer *recognizerin self.textView.gestureRecognizers)

{

if([NSStringFromClass([recognizer class]) isEqualToString:@"UITextTapRecognizer"] || [NSStringFromClass([recognizer class]) isEqualToString:@"UITapAndAHalfRecognizer"]) {

recognizer.enabled=NO;

}

}

暴力一点总是好的!现在手势已经可以正常使用了,可是TextView焦点获取不到了!但这样可以证实UILongPressGestureRecognizer确实和UITextTapRecognizer,UITapAndAHalfRecognizer有事件冲突,那下面就好解决了!

UILongPressGestureRecognizer *longPress =[[UILongPressGestureRecognizer alloc] initWithTarget:selfaction:@selector(longBangClick:)];

longPress.delegate=self;

[self.textView addGestureRecognizer:bangPress];

- (BOOL)gestureRecognizer:(UIGestureRecognizer*)gestureRecognizer  shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer*) otherGestureRecognizer{

NSLog(@"gestureRecognizer%@",[gestureRecognizer class]);

NSLog(@"otherGestureRecognizer%@",[otherGestureRecognizer class]);

returnYES;

}

果不其然

2017-03-24 10:08:14.298371 Medicare[9530:1172527] gestureRecognizer UILongPressGestureRecognizer

2017-03-24 10:08:14.298449 Medicare[9530:1172527] otherGestureRecognizer UITextTapRecognizer

最终

- (BOOL)gestureRecognizer:(UIGestureRecognizer*) gestureRecognizer  shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer*) otherGestureRecognizer{

if([gestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]] && [NSStringFromClass([otherGestureRecognizer class])isEqualToString:@"UITextTapRecognizer"]){

returnNO;

}

returnYES;

}

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender

{

returnNO;

}

最后可以通过上面的方法去除系统UIMenuController的出现。

相关文章

网友评论

      本文标题:iOS解决UITextView 长按手势冲突

      本文链接:https://www.haomeiwen.com/subject/abpznttx.html