5

私は、すべてユーザーのインタラクティブなセクション (子) とすべてのフルスクリーンを持つサブビューのスタックを持っています。問題は、スタックの一番上にある非インタラクティブなセクションに触れると、そのタッチがスタックの残りの部分に伝播されないことです。私のセットアップ:

ビュー A --ビュー B (フルスクリーン コンテナ、それ自体はインタラクティブではありませんが、インタラクティブなサブビューがあります) ----ビュー B1 (インタラクティブ) ----ビュー B2 (インタラクティブ) --ビュー C (B と同じ) ----ビュー C1 (インタラクティブ) ----ビュー C2 (インタラクティブ)

B と C は両方とも全画面表示ですが、B1/B2/C1/C2 は画面のごく一部です。

[a addSubview:b];
[a addSubview:c];

C1/C2 以外の何かに触れた場合、タッチ イベントで B (B1/B2) 内のどこかにヒットしたかどうかを確認したいのですが、代わりに A に戻り、次に A の親に戻ります。これを行うことは可能ですか?C で userInteractionEnabled NO を設定し、C1/C2 で YES を設定した場合、内側の呼び出しも取得されませんが、この場合、予想どおり、B はタッチを取得します。

編集:ビュースタックを手動でトラバースして、すべてではなく特定のサブビューのみをチェックすることになりました:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {

    if (self != self.topCustomViewsContainer) {     
        for (UIView *v in self.createdSubviews) {
            CGPoint newPoint = point;
            newPoint.x -= v.frame.origin.x;
            newPoint.y -= v.frame.origin.y;
            UIView *hit = [v hitTest:newPoint withEvent:event];
            if (hit)
                return hit;
        }
        return nil;

    }

    return [super hitTest:point withEvent:event];
}
4

2 に答える 2

8

1 つの可能性は、

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event

ビュー B のメソッドです。B のサブビューがヒットした場合にのみ返すようにすることができます。次のようにしてみてください。

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
  UIView *hitView = [super hitTest:point withEvent:event];
  if (hitView == self) {
    return nil;
  } else {
    return hitView;
  }
}
于 2013-04-17T19:20:21.710 に答える