2013-06-02 28 views
27

を食べて、私は私が使用して、いくつかのUIオーバーレイを表示/非表示するためにシングルタップジェスチャー認識を追加するUIScrollView持っている:私は追加ScrollViewジェスチャー認識は、すべてのタッチイベント

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

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

とをUIScrollViewの下部にeasy table viewがあります。すべてが正しく機能しています(水平と垂直の両方をスクロールします)が、タップはジェスチャ認識機能(上記)のみで認識されますが、簡単なテーブル表示では認識されません。 ジェスチャ・リスナーを登録する行が削除された場合、すべて正常に動作し、テーブル・ビューにはそれ自体がタップします。

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

答えて

61

これは問題を解決するはずです。
Detect touch event on UIScrollView AND on UIView's components [which is placed inside UIScrollView]
アイデアは、ジェスチャ認識プログラムにタッチイベントを飲み込まないように指示することです。これを行うには、singleTapのcancelsTouchesInViewプロパティをNOに設定する必要があります。これはデフォルトでYESです。

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

これはトリックでした:) –

+2

私は似たような問題があります([私の質問](http://stackoverflow.com/questions/33105678/in-ios-button-tapping-not-fired-when-keyboard-is-表示されます))しかし、解決策は私のために働いていません。場合によってはイベントが発生することもあります。 – new2ios

+1

その1つは最終的なsolution.thanks zambreyです –

5

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

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

私は理由がUser Interaction EnabledはUIImageViewのためfalseに設定されていることだと思います。

scrollView.delegate = self 

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

scrollView.addGestureRecognizer(allowMultipleTouches) 

あなたのスクロールビューはストーリーボードにある場合は、することを忘れないでください:あなたはそれに

スウィフト2.2以降のバージョン@zambrey

2

感謝をタップ有効にするにはtrueに設定する必要がありView Controllerでアウトレットをピン止めします。この例では、scrollViewUIScrollViewのアウトレットです。

1

TapGesturesが私のために働いた。もう一方のスワイプでは、スクロールを無効にしなければならず、スクロールしていました。

5
 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 

3.0

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

迅速かつ選択方法は次のようです。

func handleTap(_ recognizer: UITapGestureRecognizer) { 
    // Perform operation 
} 
+0

完璧なソリューション! –

1

UIscrollViewで任意の種類のジェスチャーをキャプチャできます。 set cancelsTouchesInViewプロパティーをfalseに設定するなど、デフォルトのプロパティーの一部も処理するようにしてください。デフォルトではtrueです。 セレクタで区別するために、サブビューにいくつかのタグを付けます。 &も、ユーザーの操作を真にすることができます。

LETタップ= UITapGestureRecognizer(ターゲット:自己、アクション:

セレクタ(didTapByUser(_ :)))

1

これはスウィフト3/Xcodeの8

に私のために働きました
self.scrollView.touchesShouldCancel(in: ** the view you want the touches in **) 
    self.scrollView.canCancelContentTouches = false 

幸運を祈る!

+0

この情報をコメントに残す代わりに、回答を編集して直接追加してからコメントを削除してください。インデントを修正する機会を得ることもできます(Markdownでのコード書式設定には4つのスペースが必要ですが、8つで、余分なインデントレベルが必要です)。ありがとうございました! –

関連する問題