3

背景ビューへのタッチをどのように処理する必要がありますか、または処理しない(無視する)必要がありますか?タッチイベントに応答したいサブビュー(オブジェクト)を持っているのは、たまたま私のViewControllerのビューです。ビューにuserInteractionEnabled=NOを設定すると、サブビューのすべてのインタラクションもオフになるようです。

私は現在テスト中です

if ([[touch view] superview] == self.view) 

タッチで開始/移動/終了。しかし、私はいくつかの条件付きテストを排除しようとしているので、より良い方法を探しています...

4

2 に答える 2

2

答えてくれてありがとうダン、素晴らしい質問も。

ただし、受け入れられた回答にはエラーがあります。hitTesting サブビューは、ポイントをサブビューに変換して実行する必要があります。また、subviewIndex は「for」の前に既に定義されています。

サブビューは z インデックスに従って順序付けされるため、反復処理は最後から最初のものに移動する必要があります ( iOS のイベント処理 - how hitTest:withEvent: と pointInside:withEvent: are related?およびUIView 階層インデックスを取得する方法 ??? を参照してください)。 (つまり、他のサブビュー間の深さ) )。

更新されたコードは次のとおりです。

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    UIView *hitView = nil;
    NSArray *subviews = [self subviews];
    int subviewIndex, subviewCount = [subviews count];
    for (subviewIndex = subviewCount-1; !hitView && subviewIndex >= 0; subviewIndex--) {
        UIView *subview = [subviews objectAtIndex:subviewIndex];
        hitView = [subview hitTest:[self convertPoint:point toView:subview] withEvent:event];
    }
    return hitView;
}
于 2013-02-25T18:56:35.720 に答える
2

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;を再帰的に呼び出します-pointInside:withEvent:。ポイントはフレーム座標にあります

バックグラウンドビューでそれをオーバーライドすると、ヒットするサブビューを指定できます-怠惰になり、各サブビューにyesを返し、自分自身を返さないかどうかを尋ねることができます(すべてがnilを返す場合はnilを返します)。何かのようなもの:

UIView *hitView = nil;
NSArray *subviews = [self subviews];
int subviewIndex, subviewCount = [subviews count];
for (int subviewIndex = 0; !hitView && subviewIndex < subviewCount; subviewIndex++) {
    hitView = [[subviews objectAtIndex:subviewIndex] hitTest:point withEvent:event];
}
return hitView;
于 2009-07-08T22:27:36.213 に答える