2017-01-03 8 views
0

私のアプリケーションでは、ページ付き水平スクロールビューが使用されます。各ページにはユーザーがタップできるUIControlsがあります。UIPanGestureRecognizerでの重複したUIScrollViewのキャンセル動作

UIScrollViewは、タッチやスワイプのキャンセルを処理するのに適しています。ユーザーが十分速くスワイプし始めると、スワイプします。ユーザーが強調表示された状態を有効にするのに十分な長さでタッチダウンすると、スクロールビューはスワイプしません。

私はスクロールビュー内の下向きスワイプに応答できるように、この動作をUIPanGestureRecognizerサブクラスで複製しようとしています。しかし、UIControlsが強調表示された場合には、取り消すジェスチャーを得ることはできません。

これまでのところ、私は次のことをやった:

self.refreshGesture.cancelsTouchesInView = YES; 
self.refreshGesture.delaysTouchesBegan = NO; 
self.refreshGesture.delaysTouchesEnded = NO; 

これはUIScrollViewのはへの見解に触れるが、それはUIScrollViewののパンジェスチャー認識がキャンセルされることを方法と重複しない渡す方法を複製するようです。 self.refreshGestureは、ユーザーがどれくらいゆっくりとスワイプしても、またはUIControlsの状態が何であっても常に起動されます。

私のジェスチャーでデリゲートを設定しようとしましたが、これは行く方法かもしれません。しかし、私はうまくいく組み合わせを見つけていない。たとえば、UIControl内でタッチが開始するかどうかをチェックするだけで、あまりにも頻繁にキャンセルされます。私はまた、私のコントロールでgestureRecognizerShouldBeginをオーバーライドしようとしましたが、これはハックのように思えますし、(UITextViewのジェスチャーを妨害するなど)遠い意味合いがあります。

このGIFでは、コントロールがタッチでアクティブになっていることがわかります。その場合、スクロールビューはスクロールをキャンセルします。しかし、私の下向きのパンジェスチャは同じようにキャンセルされない:

enter image description here

答えて

0

私はまさにこれを複製することができませんでしたが、WWDC 2014 #235によって提案された2つの可能性があります。

  1. メインコンテンツの上に透明なスクロールビューを追加し、そのジェスチャ認識機能をルートビューに移動します。これが何だったのか。それは私にUIScrollViewDelegateを使用させてしまいました。
  2. 「タイムアウト」ジェスチャ認識機能を使用します。ビデオは、タイムアウトジェスチャーが失敗する必要があることを示唆していますが、私の場合は、長押しのジェスチャーを使用し、長いプレスが発砲したらパンをキャンセルする方が効果的でした。 0.1秒は提案された0.15秒よりもうまくいくように見えました。
関連する問題