UIViewControllerサブクラスがあり、UIViewのいくつかを処理するとします。これらのUIViewsは)のUIViewControllerのview
プロパティのサブビューとして追加されます。UIView、そのスーパービュー、touchesBegan:
のUIViewController:
- (void)viewDidLoad {
UIImageView *smallImageView...
[self.view addSubview:smallImageView];
UIButton *button..
[self.view addSubview:button];
UIView *bigUIView.. // covers the entire screen (frame = (0.0, 0.0, 1024.0, 768.0))
[self.view addSubview:bigUIView];
...
}
私の知る限り、bigUIView
が最前面に表示され、画面全体を覆っているため、それはtouchesBegan:withEvent:
や他のビューを受け取ることになりますたとえばbutton
はタッチイベントを受信しません。
私のアプリケーションでは、アニメーション時に他のすべてのセカンダリUI要素(UIButtonsなど)の上になければならないメインユーザーインターフェイスオブジェクト(実際にはメインゲームオブジェクト)が保持されるため、 )。しかし、私は依然としてResponder ChainにUIButtonsやその他のオブジェクトを持たせたいと思っています。
私はbigUIView
クラスに次のように実装してみました:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.superview touchesBegan:touches withEvent:event];
... hit test the touch for this specific uiview..
}
注:
bigUIView
のスーパーでは、それはそれのすべてにタッチイベントを伝播するんだ、のUIViewControllerのview
プロパティを参照サブビュー?bigUIView
は、ユーザー入力も処理するため、userInteractionEnabled = YES
にする必要があります。button
/smallImageView
は、メインゲームオブジェクト(サブレイヤ:bigUIView
)の上に表示されるため、前面に表示できません。
ありがとうございます。
ありがとうございます.jlehrさん、 'pointInside:withEvent:'は解決策です。ポイントが他のサブビューのフレーム矩形の内側にあるときにNOを返すことによって、 'bigUIView'の' -touchesBegan:withEvent: 'メソッドは呼び出されず、' button'のアクションがトリガされます。これは 'bigUIView'と' button'の間の結合を引き起こすことに注意してください。 'bigUIView'が画面全体をカバーしているとき、どうすれば' UIViewController'のイベントフェーズメソッドだけをインターセプトできますか? 'bigUIView'クラス内に別のメソッドシグネチャを作成し、それを" catch all "' UIViewController'クラスによって委譲させますか? –
いいえ、 'bigUIView'にイベントフェーズメソッドを実装しないでください。そうすれば、メッセージは、オーバーライドされた実装(例えば、 'UIButton'またはカスタム' UIViewController'サブクラス)を持つオブジェクトに到達するまで、レスポンダチェーンの上に転送されます。 – jlehr
カップリングに関しては、ビューコントローラにデリゲートメソッドを実装して、実際の決定を行うために 'bigUIView'インスタンスが呼び出せるようにすることを検討してください。このようにして、ビューコントローラは、どのビューがメッセージを取得するかを計算する役割を担い、カップリングが全くないことになります。 – jlehr