この引用は、なぜそれがそのように振る舞うのかについてのあなたの質問に答えます:
タッチイベント。ウィンドウオブジェクトは、ヒットテストとレスポンダーチェーンを使用して、タッチイベントを受信するビューを見つけます。ヒットテストでは、ウィンドウはビュー階層の最上位のビューでhitTest:withEvent:を呼び出します。このメソッドは、YESを返すビュー階層内の各ビューでpointInside:withEvent:を再帰的に呼び出し、タッチが行われた境界内のサブビューが見つかるまで階層を下に進みます。そのビューがヒットテストビューになります。(ソース)
UITapInSubviewsView
回避策の1つは、次の定義を使用して独自の回避策を作成することhitTest
です。
(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
NSEnumerator *reverseE = [self.subviews reverseObjectEnumerator];
UIView *iSubView;
while ((iSubView = [reverseE nextObject])) {
UIView *viewWasHit = [iSubView hitTest:[self convertPoint:point toView:iSubView] withEvent:event];
if(viewWasHit)
return viewWasHit;
}
return [super hitTest:point withEvent:event];
}
次に、このクラスを親ビューに使用します。
(このコードは数週間前のSOからの投稿で見つかりましたが、もう見つからないようです。プロジェクトからコピーしただけです)。