切り替えたいビューではなく、スーパービューでタッチを処理する必要があります。これにより、タッチイベントを失うことなくビューを切り替えることができます。ただし、これを行うときは、切り替えたい特定のサブビューでタッチが発生しているかどうかを自分でテストする必要があります。これはさまざまな方法で実行できますが、開始するためのいくつかの方法を次に示します。
Rects / Pointを別のビューに変換する:
[view convertRect:rect toView:subview];
[view convertPoint:point toView:subview];
ポイントがビューにあるかどうかをテストするいくつかの方法を次に示します。
[subView hitTest:point withEvent:nil];
CGRectContainsPoint(subview.frame, point); //No point conversion needed
[subView pointInside:point withEvent:nil];
一般に、UIGestureRecognizersを使用することをお勧めします。たとえば、UIPanGestureRecognizerを使用している場合は、ジェスチャレコグナイザーが呼び出すことができるメソッドを作成し、そのメソッドで作業を行います。例えば:
- (void) viewPanned:(UIPanGestureRecognizer *)pan{
if (pan.state == UIGestureRecognizerStateBegan){
CGRect rect = subView.frame;
newView = [[UIView alloc] initWithFrame:rect];
[subView removeFromSuperview];
[self addSubview:newView];
} else if (pan.state == UIGestureRecognizerStateChanged){
CGPoint point = [pan locationInView:self];
newView.center = point;
} else {
//Do cleanup or final view placement
}
}
次に、レコグナイザーを初期化し、それをターゲット(通常は自己)に割り当てて追加します。
[self addGestureRecognizer:[[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(viewPanned:)]];
これで、自己(サブビューを管理するスーパービュー)がパンの動きに応答します。