私はiPhone(iOS 4.0以降)アプリを開発中ですが、複数のビュー間のタッチ処理に問題があります。ビュー構造は次のようになっています。
---> A superView
|
---> SubView - A
|
---> SubView - B (exactly on top of A, completely blocking A).
基本的に、スーパービューと、兄弟サブビュー A および B があります。B は A と同じフレームを持っているため、A は完全に非表示になります。
今、私の要求はこれです。
- SubView B は、すべてのスワイプおよびタップ (シングルおよびダブル) ジェスチャを受信する必要があります。
- SubView A はすべてのピンチ ジェスチャを受信する必要があります。
これは私がビューにジェスチャー認識機能を追加した方法です
UISwipeGestureRecognizer *leftSwipe = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(leftSwipe:)];
[leftSwipe setDirection:(UISwipeGestureRecognizerDirectionLeft)];
leftSwipe.delegate = self;
[bView addGestureRecognizer:leftSwipe];
[leftSwipe release];
UISwipeGestureRecognizer *rightSwipe = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(rightSwipe:)];
[rightSwipe setDirection:(UISwipeGestureRecognizerDirectionRight)];
rightSwipe.delegate = self;
[bView addGestureRecognizer:rightSwipe];
[rightSwipe release];
UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(handlePinch:)];
pinch.delegate = self;
[aView addGestureRecognizer:pinch];
[pinch release];
私はいくつかの調査を行い、UIGestureRecognizerDelegate
有望に思えたのでデリゲートメソッドを実装しました
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
サブビューBにNOを返して、基礎となるビューがこれらのイベントを取得することを期待しました。しかし、運がありませんでした。
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{
if ([gestureRecognizer isKindOfClass:[UIPinchGestureRecognizer class]] && [gestureRecognizer view] == bView) {
NSLog(@"pinchGesture");
//bView.userInteractionEnabled = NO;
return NO;
}
return YES;
}
次に、ピンチ ジェスチャが認識されたときに、デリゲート コールバック (上記ブロックのコメント コード) 内で SubView B のユーザー操作を無効にして、ジェスチャの残りの部分が SubView A によって受信されることを期待しました。しかし、ここでもうまくいきませんでした。
それが今の私の立場です。これ質問、受け入れられた回答にはプロパティが含まれます。ただし、特定のタッチ イベントをキャンセルするだけで、転送は行わないとcancelsTouchesInView
思います。cancelsTouchesInView
私の要件を満たす他の方法はありますか? あなたが提供するどんなヒントでも、私は取り組む準備ができています。
編集: 賞金タイム
私のいわゆるサブビュー A は、実際にはサードパーティ ライブラリの View クラスのインスタンスであり、すべてのタッチが削除され、その上でのジェスチャを制御できません。左右のスワイプには異なる実装が必要で、ピンチ、タップなどは、このサードパーティ ビューと同じように動作する必要があります。そこで、左右のスワイプを取得するために、A の上にビュー (サブビュー B) を配置しました。ただし、今度は、他のジェスチャ イベントを基礎となるライブラリに転送したいと考えています。
ベストアンサー1
あなたの問題を正しく理解しているのであれば、A ビューと B ビューと同じように、四角形を含む別のクリアなビューを追加し、そのビューにすべてのジェスチャを実装するだけで済みます。ピンチ ジェスチャを実行するとサブビュー A が制御され、スワイプとタップ (シングルおよびダブル) ジェスチャを実行するとサブビュー B が制御されます。ポインターを使用するか、受信したジェスチャをサブビューを制御するクラス内のメソッドに送信するなど、さまざまな方法で実行できます。
例えば:
UISwipeGestureRecognizer *leftSwipe = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(leftSwipe:)];
[leftSwipe setDirection:(UISwipeGestureRecognizerDirectionLeft)];
leftSwipe.delegate = subViewAcontroller;
[clearView addGestureRecognizer:leftSwipe];
[leftSwipe release];
UISwipeGestureRecognizer *rightSwipe = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(rightSwipe:)];
[rightSwipe setDirection:(UISwipeGestureRecognizerDirectionRight)];
rightSwipe.delegate = subViewAcontroller;
[clearView addGestureRecognizer:rightSwipe];
[rightSwipe release];
UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(handlePinch:)];
pinch.delegate = subViewBcontroller;
[clearView addGestureRecognizer:pinch];
[pinch release];
または:
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{
if ([gestureRecognizer isKindOfClass:[UIPinchGestureRecognizer class]]) {
NSLog(@"pinchGesture");
[subViewBcontroller solvePinchGesture: gestureRecognizer];
}
//etc
return YES;
}