UIGesture を Ask Question の背後のビューに転送する

UIGesture を Ask Question の背後のビューに転送する

私はiPhone(iOS 4.0以降)アプリを開発中ですが、複数のビュー間のタッチ処理に問題があります。ビュー構造は次のようになっています。

---> A superView 
     |
     ---> SubView - A 
     |
     ---> SubView - B (exactly on top of A, completely blocking A).

ここに画像の説明を入力してください

基本的に、スーパービューと、兄弟サブビュー A および B があります。B は A と同じフレームを持っているため、A は完全に非表示になります。

今、私の要求はこれです。

  1. SubView B は、すべてのスワイプおよびタップ (シングルおよびダブル) ジェスチャを受信する必要があります。
  2. 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;
}

おすすめ記事