0

次のように階層化されたUIViewのセットがあります。

  • UIWindow
  • UIViewController
  • UIView(ウィンドウ全体をカバー;タグ:41)
  • UIView(タグ:100(UIViewの上半分をカバー(タグ:41))
  • UIScrollView(下半分;タグ:126)
  • UIView(UIScrollViewをカバー;タグ:21)
  • UIView(tag:22)<-----タグの一部をカバー-21 UIView

一番上のUIView(tag:22)は、タップを認識したい唯一のUIViewです。NSLogを使用すると、タグは常にtag:41を参照します。

これがViewController(-viewDidLoadメソッド)の私のコードです:

    // Create and initialize a tap gesture  
 UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTap:)];
 tap.numberOfTapsRequired = 1;
 tap.numberOfTouchesRequired = 1;
 [self.view addGestureRecognizer:tap];

これはタップを処理するコードです(これもVCに配置されます)

- (void)singleTap:(UIGestureRecognizer*)gestureRecognizer {

CGPoint pt = [gestureRecognizer locationInView:self.view];

UIView *v = [self.view hitTest:pt withEvent:nil];
NSLog(@"\n\nx: %ld\ny: %ld\ntag: %d",(long)pt.x, (long)pt.y, self.view.tag);

if ([v isKindOfClass:[SubViewData class]]) {
    NSLog(@"SubViewData!");
    return;
}

}

イベント処理ガイド(32ページ)を読むタップされた領域の制約内にある最初のビューは、ヒットテスト(この場合はtag:41)を取得するビューであることがわかります。タグ:41の上半分に別のUIView(タグ:100)があり、タップも認識しているため、ヒットテストを取得するにはタグ:22が必要です...

更新: タップを処理するコードを追加しました... UIVIew tag:22の場合を除いて、プログラムでタップを拒否できる方法はありますか?

4

1 に答える 1

4

ビュー全体にアタッチしてみて、デリゲートメソッドを実装してください

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)sender {
   return (CGRectContainsPoint(self.myTargetView.frame, [sender locationInView:self.view]);
}

複数UIGestureRecognizersあり、それぞれに委任する場合は、次を使用します。

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)sender {
    if (self.neededGestureRecognizer == sender) {
       return (CGRectContainsPoint(self.myTargetView.frame, [sender locationInView:self.view]);
    }
    return YES;
}

'日と一致する

于 2013-03-12T19:51:49.460 に答える