Uiresponderチェーンの説明が必要です
-
27-10-2019 - |
質問
私は私を手に入れるのに苦労しています UIButtons
, UIScrollViews
この状況で働いているなど:
私は基地を持っています UIViewController
, 、これはのルートコントローラーです UIWindow
。そのレイヤーの上には、他にもあります UIViews
追加して、「中間層ビュー」と呼びます。そして、一番上に私は別のものがあります UIView
オーバーレイオブジェクト用に追加されました。
ミドルレイヤービューは、さまざまなビューに対して定期的に変更されます。 UIView
使用するのはaからです UIViewController
, 、ペンnibファイルによって作成されました。これが例です
if ( mode == eModeShowView1 )
UIViewController* nextController = [[UIViewController alloc] initWithNibName:@"View1"...
else if ( mode == eModeShowView2 )
UIViewController* nextController = [[UIViewController alloc] initWithNibName:@"View2"...
[UIView insertSubview:nextController.view below:m_overlayView];
今、私が画面上で触れると、最初のレスポンダーは明らかに OverlayView
または何か UIResponder
に OverlayView
それは触れられました。 UIEvent
タッチ入力のビューチェーンが上がりますが、中間層ビューと UIResponders
その上 UIView
全体的に。ルートにまっすぐジャンプします UIViewController
.
ここで何が起こっているのか誰もが知っていますか?
どういうわけか2つを作成することで解決できますか UIEvents
?オーバーレイビュー用、もう1つは中間層ビュー用ですか?それは可能ですか?もしそうなら、どうですか?
どんな助けも感謝します。ありがとう、リッチ
解決
edit1 start:
uitapgesturerecognizerをm_overlayviewとinitwithtargetに配置できます:あなたのミドルビューアクション:Method-in-middleview
MiddleViewでは、承認剤を識別することができます。
edit1 end:
デバッグできます。ログを使用するだけです touchesbegan
すべてのコントローラーで。タッチ応答のシーケンスを記録することで明らかになります。
OK ..だからドキュメントからの方法の説明はあなたに答えるかもしれません。君の m_overlayView
と nextController.view
お互いを兄弟と見なしており、監督ではありません。したがって、それらのいずれかに対するあなたのタッチは、他のものに報告されるのではなく、代わりにベースに報告されます superview
これは一般的です superview
両方の兄弟に。
したがって、あなたは中間層がバイパスされていることを得ています。実際、あなたの中間層は兄弟であり、もう監督ではありません。少なくともあなたに何らかの先を与えることを願っています;)
insertSubview:belowSubview:
ビュー階層の別のビューの下にビューを挿入します。
(void)insertSubview:(UIView *)view belowSubview:(UIView *)siblingSubview
パラメーター:
view
別のビューの下に挿入するビュー。それから削除されます superview
兄弟の兄弟ではない場合。
siblingsubview:
挿入されたビューの上にある兄弟ビュー。
討論:
この方法はビューを保持し、次のレスポンダーを受信機に設定します。 superview
.
ビューには、1つのスーパーワークのみができます。ビューがすでにある場合 superview
そして、そのビューは受信機ではありません、この方法は前のものを削除します superview
受信機を新しいものにする前に superview
.