タッチイベントをすべてのサブビューにパススルーする最良の方法は何ですか?
ViewController -> ビュー -> (subview1, subview2)
サブビュー 1 とサブビュー 2 の両方がタッチ イベントに応答するようにします。
サブビューのタグを目立つタグと同じに設定します。次に、それらのタグを探してビューをツリー検索します。残念ながら、サブクラス化せずにこれを行う良い方法はありません。サブクラス化する場合は、ビューをサブクラス化し、タッチ時に同じサブクラスの他のすべてのビューがリッスンする NSNotification をスローします。
親のタッチ ハンドラーでは、そのビューのサブビューを反復処理して、同じハンドラーを呼び出すことができます。
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
for(UIView *subview in [self.view subviews]) {
[subview touchesBegan:touches withEvent:event];
}
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
for(UIView *subview in [self.view subviews]) {
[subview touchesMoved:touches withEvent:event];
}
}
または、特定のサブビューを識別する必要がある場合は、サブビューに整数のタグを割り当てて、後で識別することができます。
- (void)loadView {
UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(10,10,10,10)];
view1.tag = 100;
[self.view addSubview:view1];
UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(20,20,20,20)];
view2.tag = 200;
[self.view addSubview:view2];
}
その後、後でタッチ イベントによって呼び出される ViewController メソッドで
- (void)touchEventResponder {
UIView *view1 = [self.view viewWithTag:100];
// Do work with view1
UIView *view2 = [self.view viewWithTag:200];
// Do work with view2
}