2017-09-01 15 views
0

パンジェスチャレコグナイザ(SomePanGestureRecognizerと呼ぶことができます)が呼び出されたときに、UIScrollViewでジェスチャレコグナイザを無効にする、または強制的に失敗させるにはどうすればよいですか?UIScrollViewをパンジェスチャ認識器にする方法を教えてください。

gestureRecognizer(_:shouldBeRequiredToFailBy:)メソッドは、ジェスチャー認識ツールではなく、ジェスチャー認識ツールを使用します。その理由がわからないため、構文エラーが発生しています。

私はUIScrollViewは、サブクラス化していて失敗を強制するために使用される方法は、以下のデリゲートである:

class CustomScrollView: UIScrollView { 

    override init(frame: CGRect) { 
     super.init(frame: frame) 

     configure() 

    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 

     configure() 

    } 

    private func configure() { 

     isScrollEnabled = true 
     showsHorizontalScrollIndicator = false 
     showsVerticalScrollIndicator = false 
     isPagingEnabled = true 
     bounces = false 
     alwaysBounceVertical = false 
     alwaysBounceHorizontal = false 

    } 

} 

// gesture recognizer delegate 
extension CustomScrollView: UIGestureRecognizerDelegate { 

    // allow simultaneous gestures 
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { 
     return true 
    } 

    // force failure 
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer) -> Bool { 

     // TLDR: disable uiscrollview when SomePanGestureRecognizer is called 

    } 

} 


そして、ここでは失敗するUIScrollViewジェスチャ認識を強制する必要がパンジェスチャー認識であります:

func addSomePanGestureRecognizer() { 
    SomePanGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(oneBPanGestureHandler(gesture:))) 
    oneBHandle.addGestureRecognizer(SomePanGestureRecognizer) 
} 



UPDATE I UIPanGestureRecognizerをサブクラス化して、同時のデリゲートを使用して動作させましたが、私はUIKitを使用してカスタムのパンジェスチャの前にUIScrollViewを常に無効にしているので、これを行うのは難しい方法です。

// gesture recognizer delegate 
extension CustomScrollView: UIGestureRecognizerDelegate { 

    // simultaneous gestures 
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { 

     if otherGestureRecognizer is CustomPanGestureRecognizer { 
      return false 
     } else { 
      return true 
     } 

    } 

} 


UPDATE 2また、これは動作しますが、私はそれがいけないように感じるので、私は理由を知りません。それは別の方法ではありませんか?

私は、これはあなたが探しているものであると考えてい
// force failure 
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool { 

    if otherGestureRecognizer is CustomPanGestureRecognizer { 
     return true 
    } else { 
     return false 
    } 

} 
+0

'UIPanGestureRecognizers'は' UIGestureRecognizer'のサブクラスです。それは問題ではありません。 – PeejWeej

答えて

0

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { 
    let isPanAndOtherRecognizer = gestureRecognizer is UIPanGestureRecognizer && otherGestureRecognizer is SomePanGestureRecognizer 
    return !isPanAndOtherRecognizer 
} 

// force failure 
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer) -> Bool { 

    let isPanAndOtherRecognizer = gestureRecognizer is UIPanGestureRecognizer && otherGestureRecognizer is SomePanGestureRecognizer 
    return isPanAndOtherRecognizer 
} 
+0

コンパイルエラー:SomePanGestureRecognizerは宣言されていない型です – sconewolf

+0

これは指定したクラスです。独自のサブクラスを使用してください。 – PeejWeej

+0

私は、UIScrollViewの無名ジェスチャ認識機能をパンジェスチャ認識機能SomePanGestureRecognizerに失敗させたいと考えています。これは機能しないので、同じページにいてはいけません。 – sconewolf

関連する問題