2

UILongPressGestureRecognizer を追加するコレクション ビュー/スクロール ビューがあります。動作しますが、state .Began は state と一緒にしか発火しません。終了しました。状態も追跡したいので、それは私にはうまくいきません。

私が見つけた問題は、コレクション ビューの Scroll ジェスチャと競合していることです。

scrollEnabled を false に設定すると、すべてが期待どおりに機能します。

私のviewDidLoadには

let longPressedGestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(PhotosViewController.Scrubber(_:)))
self.scrubberCollectionView.addGestureRecognizer(longPressedGestureRecognizer)
longPressedGestureRecognizer.minimumPressDuration = 0.6
longPressedGestureRecognizer.delegate = self

self.scrubberCollectionView.addGestureRecognizer(longPressedGesture)

また、これらを追加して、パン ジェスチャが有効になっているときに 1 つのジェスチャが失敗するようにしようとしました… (そして、shouldRecognizeSimultaneouslyWithGestureRecognizer も試しました。

longPressedGestureRecognizer.requireGestureRecognizerToFail(scrubberCollectionView.panGestureRecognizer)

 func overridePan(gestureRecognizer: UILongPressGestureRecognizer, shouldRequireFailureOfGestureRecognizer otherGestureRecognizer: UIPanGestureRecognizer ) -> Bool {
        return (gestureRecognizer == longPressedGesture && otherGestureRecognizer == self.scrubberCollectionView.panGestureRecognizer )
    }

…無駄に。

私が持っている主な機能について

        func Scrubber(gesture: UILongPressGestureRecognizer) {
            if (gesture.state == .Began ) {
                 print("Began")
            }
            else if (gesture.state == .Changed) {
                 print("Changed")
            }
            else if (gesture.state == .Ended){
                 print("Ended")
            }
        }

長押しすると、タッチダウン時にイベントが発生せず、タッチアップ時に次の結果が得られます。

Began
Ended

実際の長押しは機能しています。タップすると、Scrubber 関数は呼び出されず、Ended 状態で Began と Ended の両方を起動するだけです。

そして、これらを viewDidLoad に追加して、スクロールビューのタッチを遅らせたり、完全にキャンセルしたりしようとしました…</p>

self.scrubberCollectionView.delaysContentTouches = true

    let longPress = UILongPressGestureRecognizer()
    func gestureRecognizer(gestureRecognizer: UILongPressGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {

        if(touch.view == scrubberCollectionView && gestureRecognizer == longPress){
            return true
        }else{
            return false
        }
    }

…そして何もない。

4

1 に答える 1

0

I figured it out. I was adding the shouldRequireFailureOfGestureRecognizer inside viewDidLoad. It needs to be outside it.

In order to place it outside and make it work, you need to create your gesture variables (in my case "longPressedGesture") as optionals also outside viewDidLoad, like:

var longPressedGesture : UILongPressGestureRecognizer?

then inside viewDidLoad you create the gestures

 longPressedGesture = UILongPressGestureRecognizer(target: self, action: #selector(PhotosViewController.Scrubber(_:)))
            longPressedGesture.delegate = self
            self.scrubberCollectionView.addGestureRecognizer(longPressedGesture)
于 2016-03-07T01:24:29.107 に答える