5

そのUITextView上に複数ありUIViewます。上の任意のタッチ アクションはUIView、対応する に関連付けることができIBActionます。私のシナリオでは、ダブルタップ ジェスチャを に関連付ける必要があります。これ以外UIViewIBAction他のタッチは、基になる に転送する必要がありますUITextView

上記のシナリオを実行する私のコードブロック

UITextView *textView = [[UITextView alloc] init];

UIView *subview = [[UIView alloc] init];

UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapDetected:)];
doubleTap.numberOfTapsRequired = 2;
[subview addGestureRecognizer:doubleTap];

[textView addSubview: subview];

次のSOソリューションを試しましたが、

タッチイベントを無視して別のサブビューの UIControl オブジェクトに渡す方法は?

hitTest を使用すると、上にある UIViews でダブルタップ ジェスチャをキャプチャできませんUITextView

サブビューで開始されたタッチを受け取るように UIGestureRecognizer を作成します。

inから to への転送UITouchセットは、期待されるデフォルトの動作を提供していませんtouchBegan:withEvent:UIViewUITextViewUITextView

このシナリオに対処するために利用できる他のソリューションはありますか?

前もって感謝します。

4

2 に答える 2

3

これは、次の方法で実現できます。

  1. タッチイベントを無視して別のサブビューのUIControlオブジェクトに渡す方法で提案されているように、UITextViewにタッチイベントを処理させますか?
  2. UIViewのhitTestで、後で使用できるように、それが発生したビューへの参照を保存します
  3. hitTest参照がnullでないかどうかをチェックする、カスタムのダブルタップジェスチャレコグナイザーを追加します。これは、ターゲットビューでダブルタップが発生したことを示し、イベントをそのビューに転送します。そうでない場合は、ジェスチャレコグナイザを失敗させます。ジェスチャレコグナイザーを失敗させるには、UIKit / UIGestureRecognizerSubclass.hをインクルードし、stateプロパティをUIGestureRecognizerStateFailedに設定する必要があります
  4. UITextViewにジェスチャレコグナイザーを追加します
  5. UITextViewを拡張して、gestureRecognizersゲッターをオーバーライドし、ジェスチャレコグナイザーをループして、カスタムジェスチャが失敗するように要求します。ジェスチャレコグナイザーは頻繁にリセットされるように見えるため、これはゲッターで行う必要があります
于 2013-03-01T22:07:04.280 に答える
0

サブビューは不要です。削除して置き換えます。

[subview addGestureRecognizer:doubleTap];

と:

[textView addGestureRecognizer:doubleTap];

これで、tapDetected: メソッドでイベントを取得する必要があります。

UITextView の動作を変更していないことを確認するには、次のメソッドを使用します。

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

また

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
于 2013-01-19T13:46:01.357 に答える