4

現在、UITextViewにダブルタップジェスチャを持たせたいと思っています。UITableViewには独自のダブルタップジェスチャがあるようです。ダブルタップすると、一部のテキストが選択されます。したがって、このデフォルトのダブルタップジェスチャを自分のジェスチャレコグナイザに削除したいと思います。私は多くの方法を試しましたが、すべて失敗しました。UITextViewのデフォルトの認識機能を削除する方法はないようです。また、このUITextViewに透明なビューを追加して、ダブルタップイベントを実行したいのですが、このサブビューはUITextViewの他のジェスチャをブロックします。UITextViewにダブルタップジェスチャレコグナイザーを追加する方法はありますか?回避策があることを本当に望んでいます。

私はまだiOS5の回避策を期待しています:)

4

3 に答える 3

13

テキストビューに接続されている他の多くのジェスチャ認識機能があります。あなたはそれらを必要としないようですので。それらを削除することができます。

myTextView.gestureRecognizers = nil;

ダブルタップレコグナイザーを追加する前に。できます。

その後、追加することができます

UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(mySelector)];
tapRecognizer.numberOfTapsRequired = 2;
tapRecognizer.numberOfTouchesRequired = 1;
[myTextView addGestureRecognizer:tapRecognizer];
于 2012-11-29T12:38:08.533 に答える
2

iOS6で解決策があります。UIGestureRecognizerDelegateを使用して、gestureRecognizerShouldBegin:とgestureRecognizer:shouldReceiveTouch:をオーバーライドできます。この2つの方法では、ジェスチャがdoubleTapGestureForZoomingであるかどうかを確認し、そうでない場合はNOを返すか、YESを返します。これはiOS6で完全に機能しますが、iOS5ではこれらの2つのデリゲートメソッドが呼び出されていないため、iOS5では別の回避策が必要になる場合があります。最後に、回避策を取得しました。UITextViewのaddGestureRecognizerメソッドをオーバーライドして、デフォルトのジェスチャを削除できます。これが他の誰かに役立つことを願っています。

PS:UITextViewのシステムジェスチャを削除することはできません。プロパティを変更することもできません。イベントが発生すると、UItextviewのすべてのジェスチャが再び追加されるようです。

于 2012-12-10T10:22:48.240 に答える
1

この質問は古いことは知っていますが、将来の検索者のために最新の状態に保つために、iOS 7から10まで私のために機能した別のソリューションを追加すると思いました。基本的にここここで説明したソリューションをまとめますが、それらを微調整してUITextViewカスタムダブルタップを認識します。

これは、カスタムコールバックをダブルタップジェスチャに挿入し、新しいダブルタップフックを尊重するようにシングルタップジェスチャを構成するために、メソッドをサブクラス化しUITextViewてオーバーライドすることによって行われます。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
于 2016-10-02T08:00:56.340 に答える