次のように階層化された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の場合を除いて、プログラムでタップを拒否できる方法はありますか?