web-dev-qa-db-ja.com

UIScrollViewをスクロールしてジェスチャーレコグナイザーを使用するにはどうすればよいですか?

UIScrollViewにジェスチャレコグナイザがありますが、UIScrollViewがすべてのジェスチャを食べるため、ほとんど呼び出されません。

私はこの行でこの問題を部分的に回避しました:[scrollView.panGestureRecognizer requireGestureRecognizerToFail:rightSwipe];ただし、この行を使用すると、認識機能が常に受け入れられ(望ましい動作)、スクロールビューがスクロールされません。

つまり、スクロールすると、認識エンジンは受け入れられますが、ビューはスクロールしません。

どうすればこれを回避できますか、または別の解決策はありますか?

ありがとう!

20
Phillip

UIScrollViewのサブクラスを作成します。このメソッドを新しいサブクラスに追加します

- (BOOL)gestureRecognizer:(UIPanGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UISwipeGestureRecognizer *)otherGestureRecognizer 
{
    return YES;
}

ScrollViewクラスを新しいscrollviewサブクラスにします。

19

適切な委任をジェスチャ認識メカニズムに割り当てることを忘れないでください。

したがって、たとえば:

.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
    }

次に、ロジックに移ります...

それが役に立てば幸い!

4
Mert Kahraman

私にとってうまくいく方法は、サブクラスUIScrollViewであり、そのサブクラスのUIGestureRecognizerDelegateに準拠しています。次に、メソッドを呼び出します。

class ATScrollView: UIScrollView, UIGestureRecognizerDelegate { 
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
                           shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        return true
    } 
}
3
abe973t

スウィフト法
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
}
1
Esqarrouth

この正接を許してください。他の誰かが私が行ったのと同じ誤診をした場合に備えて、私はこの回答を投稿します。私のように上記の解決策がうまくいかない場合は、UISwipeGestureRecognizerを複数のビューにアタッチしようとしていないことを確認してください。 1つのビューでのみ機能し、それが最後にアタッチされたビューになります。

0
biomiker