パンジェスチャレコグナイザ(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
}
}
'UIPanGestureRecognizers'は' UIGestureRecognizer'のサブクラスです。それは問題ではありません。 – PeejWeej