UIScrollViewにジェスチャレコグナイザがありますが、UIScrollViewがすべてのジェスチャを食べるため、ほとんど呼び出されません。
私はこの行でこの問題を部分的に回避しました:[scrollView.panGestureRecognizer requireGestureRecognizerToFail:rightSwipe];
ただし、この行を使用すると、認識機能が常に受け入れられ(望ましい動作)、スクロールビューがスクロールされません。
つまり、スクロールすると、認識エンジンは受け入れられますが、ビューはスクロールしません。
どうすればこれを回避できますか、または別の解決策はありますか?
ありがとう!
UIScrollView
のサブクラスを作成します。このメソッドを新しいサブクラスに追加します
- (BOOL)gestureRecognizer:(UIPanGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UISwipeGestureRecognizer *)otherGestureRecognizer
{
return YES;
}
ScrollViewクラスを新しいscrollviewサブクラスにします。
適切な委任をジェスチャ認識メカニズムに割り当てることを忘れないでください。
したがって、たとえば:
.up
方向ジェスチャー認識機能
let swipeUp = UISwipeGestureRecognizer(target: self, action: #selector(self.handleGesture(gesture:)))
swipeUp.direction = .up
swipeUp.delegate = self // set delegate
self.addGestureRecognizer(swipeUp)
.down
方向ジェスチャー認識機能
let swipeDown = UISwipeGestureRecognizer(target: self, action: #selector(self.handleGesture(gesture:)))
swipeDown.direction = .down
swipeDown.delegate = self // set delegate
self.addGestureRecognizer(swipeDown)
また、委任に従うことを忘れないでください:
YourViewController: UIGestureRecognizerDelegate
同時認識を設定します。
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}
次に、ロジックに移ります...
それが役に立てば幸い!
私にとってうまくいく方法は、サブクラスUIScrollView
であり、そのサブクラスのUIGestureRecognizerDelegate
に準拠しています。次に、メソッドを呼び出します。
class ATScrollView: UIScrollView, UIGestureRecognizerDelegate {
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}
}
スウィフト法
UIGestureRecognizerDelegateをクラスに追加する必要があります:
class ViewController: UIViewController, UIGestureRecognizerDelegate {
デリゲートを自分に設定する必要があります:
override func viewDidLoad() {
super.viewDidLoad()
var scrollView = UIScrollView(frame: self.view.frame)
scrollView.delegate = self
}
クラスのメソッドにこの部分を追加して、アクティブな同時ジェスチャーを作成します。
func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}
この正接を許してください。他の誰かが私が行ったのと同じ誤診をした場合に備えて、私はこの回答を投稿します。私のように上記の解決策がうまくいかない場合は、UISwipeGestureRecognizerを複数のビューにアタッチしようとしていないことを確認してください。 1つのビューでのみ機能し、それが最後にアタッチされたビューになります。