如何添加双击手势到UITextView

目前我想让UITextView有一个双击手势。 看起来UITableView有自己的双击手势,当我们双击,一些文本将被选中。 所以我想删除这个默认的双击手势到我自己的手势识别器。 我尝试了很多方法,都失败了。 似乎没有办法去除UITextView的默认识别器。 我也想在这个UITextView上添加一个透明的视图来做双击事件,但是这个子视图会阻塞UITextView上的其他手势。 有没有一些方法来添加双击手势识别器到UITextView? 我真的希望有一个解决办法。

我仍然期待iOS5的工作:)

还有一些附加到文本视图的其他手势识别器。 因为你似乎并不需要他们。 你可以删除它们。

myTextView.gestureRecognizers = nil; 

在添加双击识别器之前。 有用。

那么你可以添加

 UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(mySelector)]; tapRecognizer.numberOfTapsRequired = 2; tapRecognizer.numberOfTouchesRequired = 1; [myTextView addGestureRecognizer:tapRecognizer]; 

我在iOS6上的解决scheme,我们可以使用UIGestureRecognizerDelegate,并重写gestureRecognizerShouldBegin:和gestureRecognizer:shouldReceiveTouch :. 在这两个方法中,我们可以检查手势是否doubleTapGestureForZooming,如果不是,则返回NO,否则返回YES。 这在iOS6中是完美的,但在iOS5中这两个委托方法尚未被调用,所以iOS5可能需要另一种解决方法。 最后,我得到了解决方法,我们可以重写UITextView的addGestureRecognizer方法来删除默认的手势,希望这会帮助别人。

PS:我们真的不能移除UITextView的系统手势,我们甚至不能改变它们的属性。 看来事件发生的时候,UItextview的所有手势都会被再次添加。

我知道这个问题是旧的,但为了保持当前为未来的search者,我想我会添加另一个解决scheme,已经从iOS 7到10我工作。它基本上汇集了这里和这里讨论的解决scheme,但调整他们得到UITextView识别自定义双击。

它通过addGestureRecognizer: UITextView并重写addGestureRecognizer:方法来完成此操作,以便将自定义callback注入到双击手势中,并configuration单击手势来尊重新的双击挂钩。

我在addGestureRecognizer:这样做addGestureRecognizer:因为UITextView根据当前状态不断删除和添加手势,因此您必须不断地将其重置。

这个代码应该足以让一个人开始:

 @interface MyCustomTextView () /** * we want to keep track of the current single-tap gesture so we can make sure * it waits for a double-tap gesture to fail before firing */ @property (weak, nonatomic) UITapGestureRecognizer *singleTap; /** * we want to keep track of the current double-tap gesture so we can tell a single * tap gesture to ignore this double-tap when the single tap gesture changes */ @property (weak, nonatomic) UITapGestureRecognizer *doubleTap; @end @implementation MyCustomTextView /** * this will fire when the text view is double-tapped * * @param tgr */ - (void)_handleTwoTaps:(UITapGestureRecognizer *)tgr { // ADD CODE HERE } /** * the reason why I've overridden this methods is these gestures change quite a bit * depending on the state of the UITextView, (eg, when in focus and out of focus) * and so this provides a reliable way to make sure any new gestures get updated * with custom overrides. * * @param gestureRecognizer */ - (void)addGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer { [super addGestureRecognizer:gestureRecognizer]; if ([gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]]) { UITapGestureRecognizer *tgr = (UITapGestureRecognizer *)gestureRecognizer; if ([tgr numberOfTapsRequired] == 1 && [tgr numberOfTouchesRequired] == 1) { self.singleTap = tgr; if (self.doubleTap) { [tgr requireGestureRecognizerToFail:self.doubleTap]; } } else if ([tgr numberOfTapsRequired] == 2 && [tgr numberOfTouchesRequired] == 1) { [tgr addTarget:self action:@selector(_handleTwoTaps:)]; self.doubleTap = tgr; if (self.singleTap) { [self.singleTap requireGestureRecognizerToFail:tgr]; } } } } // NOTE: I'm not sure if this is needed but it's been there for years // and so I thought I would include it just in case - (void)removeGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer { if ([gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]]) { UITapGestureRecognizer *tgr = (UITapGestureRecognizer *)gestureRecognizer; if ([tgr numberOfTapsRequired] == 2 && [tgr numberOfTouchesRequired] == 1) { [tgr removeTarget:self action:@selector(_handleTwoTaps:)]; } } [super removeGestureRecognizer:gestureRecognizer]; } @end