0

S1という名前のstackViewを含むMyUViewタイプのUIview Vがあります。S スタックには、T という名前の UITextField を含む NM という名前のスタックビューと、L という名前の UILabel を含む M という名前の別のスタックビューが含まれています。

ビューの階層は次のとおりです。

    • S1
      • NM
        • T
        • M
          • L

長押しジェスチャを認識するために、ビュー V に lprecognizer という名前の LongPressGestureRecognizer を追加しました。ビューで longPress ジェスチャ (および可能な他のジェスチャも) を検出したいのですが、ジェスチャが長押しジェスチャの場合、uitextfield T がタッチされたビューである場合にのみ特定のアクションを実行したいと考えています。

MyUView に次のデリゲート メソッドを実装しました。

- (Bool) gestureRecognizer: (UIGestureRecognizer*) gesturerecognizer shouldreceiveTouch: (UITouch*) touch {

  if (gestureRecognizer == lprecognizer)
  {
    if (touch.view == T) return YES;
    else return NO;
  }
  else return YES;
}

ジェスチャがタッチされたものとして認識されたビューは、ビュー V のサブビュー配列の最初で唯一のビューであるスタック S1 であるため、これは (テキストフィールドに触れても) 機能しません (前述の階層を思い出してください)。

私の質問は:

この関心のあるビューがビューの階層の奥深くにある場合でも、関心のある特定のビュー (たとえば、UITextField など) が特定のタッチの領域にあるかどうかを知る簡単な方法がある場合は??

ビューの階層を再帰的に検索するという考えは避けたいと思います。

4

2 に答える 2

0

このようなものが動作するはずです:

UIView *hitView = [touch.view hitTest:[touch locationInView:touch.view] withEvent:nil];

if (hitView == T) {
    // etc
}
于 2016-09-29T06:42:36.433 に答える