2012-06-04 17 views
19

私は、ビューに触れたりタップしたりすると、そのハンドラが最初に呼び出された後、そのスーパービューのハンドラが呼び出される(上に伝播する)と考えました。iOSでは、スーパービューのuserInteractionEnabledがNOの場合、すべてのサブビューも無効になっていますか?

スーパービューのuserInteractionEnabledがNOに設定されていると、すべてのサブビューと子孫もユーザーのやりとりで無効になるのは本当ですか?メインビューのみを無効にしたいが、サブビューを無効にしたくない場合はどうすればよいですか?

+0

はい正しいです。 – Lefteris

+0

ああ、UIResponderのどのような仕組みやメカニズムがこれを引き起こしているのか疑問に思っていました...今は私がこれを "事実"として覚えていますが、 –

答えて

13

あなたはそれを行うカント、

代わり

次のようにあなたの意見のarrangmentを変更します

Main View-> subViews 

Container View -> Main View that you want to set as inactive 
       -> other views that you want to still active 

だからあなたの現在のメインビューとあなたの現在のサブビュー

意志兄弟になる、新しいコンテナビューの子供

+0

"できません" "それは何ですか?質問のどの部分を参照していますか? – Honey

18

このm私が参考にしたのは、Matt NeuburgのプログラミングiOS 5で見つけた、p。 467:

userInteractionEnabled

NOに設定した場合、(サブビューと共に)このビューは 受信タッチから除外されます。このビューまたはそのサブビューの1つに触れると、その後ろのビューに「 」が表示されます。さらに

より、iOS用ガイドの取り扱いAppleのイベントは言う:

ウィンドウオブジェクトは、タッチイベントを受信するための ビューを見つけるために、ヒットテストおよびレスポンダチェーンを使用しています。ヒットテストでは、ビュー階層の一番上のビューに hitTest:withEvent:を呼び出します。この メソッドは、 ビュー内の各 ビューでpointInside:withEvent:を再帰的に呼び出して、YESを返します。 の境界内のサブビューを見つけるまで、 階層を続けます。そのビューはヒットテストビューになります。

とプログラミングのiOS 5マット・ニューバーグによって、p.485は、もしビューがNO、またはYESなどhiddenとしてuserInteractionEnabledをマーク、または不透明度が0に近い、その後、ビューとそのサブビューがトラバースされることはありませんされていることを述べましたHitTestによって(したがって、タッチには考慮されません)。

+1

独自の 'hitTest:withEvent:'を実装している人にとって優れた情報です。スーパービュー・レベルで 'if(subview.userInteractionEnabled)'をチェックする必要があるかどうかはわかりませんでしたが、デフォルトの実装ではそれ自身の 'userInteractionEnabled'プロパティをチェックしているようです。 – darvids0n

+0

どうすれば "それは後ろのビューに落ちる"という意味ですか?それはサブビューであるボタンをタップすることはできませんか? – Honey

1

まずメソッド

- (BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 
{ 
    if ([touch.view.superview isKindOfClass:[SuperViewParent class]]) return FALSE; 
    return TRUE; 
} 

第2の方法

UITapGestureRecognizer *r = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(agentPickerTapped:)]; 
    r.cancelsTouchesInView = NO; 
    [agentPicker addGestureRecognizer:r]; 
14

あなたはビュー自体を無視するhitTest(_:withEvent:)をオーバーライドし、それでもそのサブビューにタッチを提供することができます。

class ContainerStackView : UIStackView { 
    override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? { 
     let result = super.hitTest(point, withEvent: event) 
     if result == self { return nil } 
     return result 
    } 
} 
関連する問題