web-dev-qa-db-ja.com

すべてのタッチイベントを食べるScrollViewジェスチャー認識

私はシングルタップジェスチャーレコグナイザーを追加したUIScrollViewを使用して、いくつかのUIオーバーレイを表示/非表示にします:

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
[scrollView addGestureRecognizer:singleTap];

そして:

- (void)handleTap:(UITapGestureRecognizer *)sender {
    // report click to UI changer
}

UIScrollViewの下部に 簡単なテーブルビュー を追加しました。すべてが正しく機能します(水平および垂直の両方にスクロールします)が、問題はタップがジェスチャレコグナイザー(上記)のみによって認識され、簡単なテーブルビューでは認識されないことです。ジェスチャリスナーを登録する行を削除すると、すべてが正常に動作し、テーブルビューはタップ自体に気付きます。

これは、ジェスチャー認識機能がテーブルビューのタップイベントを「食べ」、下に伝播しないかのようです。

どんな助けでも大歓迎です

39
Itai Hanski

これで問題が解決するはずです。
IScrollViewおよびUIViewのコンポーネント[UIScrollView内に配置]でタッチイベントを検出
アイデアは、タッチイベントを飲み込まないようにジェスチャレコグナイザーに伝えることです。これを行うには、singleTapのcancelsTouchesInViewプロパティをNO(デフォルトではYES)に設定する必要があります。

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
singleTap.cancelsTouchesInView = NO;
[scrollView addGestureRecognizer:singleTap]; 
76
zambrey

Swift 3.

 let singleTap = UITapGestureRecognizer(target: self, action: #selector(handleTap(_:)))
 singleTap.cancelsTouchesInView = false
 singleTap.numberOfTapsRequired = 1
 scrollView.addGestureRecognizer(singleTap)

セレクターメソッドは次のようになります。

@objc func handleTap(_ recognizer: UITapGestureRecognizer) {
  // Perform operation
}
12
Jaydeep

その理由はUser Interaction Enabledは、UIImageViewではfalseに設定されます。タップを有効にするにはtrueに設定する必要があります

6
RandyTek

タッチに含める/除外するオブジェクトを設定できます。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gesture shouldReceiveTouch:(UITouch *)touch {            
   if (touch.view == [self view]) {
       return YES;
   }
   return NO;
}
6
sangony

ありがとう@zambrey

Swift 2.2+バージョン:

scrollView.delegate = self

let allowMultipleTouches = UITapGestureRecognizer(target: self, action: #selector(genderPressed))
allowMultipleTouches.numberOfTapsRequired = 1
allowMultipleTouches.cancelsTouchesInView = false

scrollView.addGestureRecognizer(allowMultipleTouches)

スクロールビューがストーリーボードにある場合、View Controllerでアウトレットを固定することを忘れないでください。この例では、scrollViewUIScrollViewのアウトレットです。

2
Nuno Vieira

これはSwift 3/Xcode 8で機能しました

self.scrollView.touchesShouldCancel(in: ** the view you want the touches in **)
self.scrollView.canCancelContentTouches = false

がんばろう!

2
hamishkeith

UIscrollViewであらゆる種類のジェスチャをキャプチャできます。 cancelsTouchesInViewプロパティをfalseに設定するように、デフォルトプロパティの一部も処理することを確認してください。これはデフォルトでtrueです。また、セレクターで区別するためにサブビューにいくつかのタグ番号を付けます。また、ユーザーインタラクションをtrueにできます。

let tap = UITapGestureRecognizer(target:self、action:

selector(didTapByUser(_ :)))

1
Aks

TapGesturesは私のために働いた。一方、スワイプでは、スクロールを無効にする必要があり、機能しました。

swipeLeftGesture = UISwipeGestureRecognizer(target: self, action: #selector(swipeToNewImage(_:)))
swipeLeftGesture.direction = .left
scrollView.addGestureRecognizer(swipeLeftGesture)

swipeRightGesture = UISwipeGestureRecognizer(target: self, action: #selector(swipeToNewImage(_:)))
scrollView.addGestureRecognizer(swipeRightGesture)

scrollView.isScrollEnabled = false
1
Maria