2009-07-08 4 views
3

バックグラウンドビューにどのように対処するか、処理しない(無視する)ことはできますか?私のView Controllerのビューには、タッチイベントに応答したいサブビュー(オブジェクト)があります。ビューのuserInteractionEnabled = NOを設定すると、サブビューのすべての対話もオフになっているようです。バックグラウンド(超)表示へのタッチを無視する

私は現在、エンド/ touchesBegan移動/に

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

のためにテストしています。しかし、私はより良い方法を探していくつかの条件付きテストを排除しようとしています...

答えて

2

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

バックグラウンドビューでこれを上書きすると、どのサブビューがヒットするかを指定することができます。怠け者になる可能性があり、サブビューがイエスになると尋ねることができます。それらがすべてnilを返す場合はnilを返します)。次のようなものがあります。

​​
2

答えDanさん、ありがとうございます。

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

サブビューはzインデックスに従って順序付けされているため、反復は最後から最初のものになるはずです(Event handling for iOS - how hitTest:withEvent: and pointInside:withEvent: are related?およびHow to get UIView hierarchy index ??? (i.e. the depth in between the other subviews)を参照)。

ここで更新されたコードです:

- (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; 
} 
は、
関連する問題