Comment désactiver ou forcer l'échec de la reconnaissance de mouvement dans un UIScrollView
lorsqu'un rappel de reconnaissance de mouvement, appelons-le SomePanGestureRecognizer
, est appelé? La méthode gestureRecognizer(_:shouldBeRequiredToFailBy:)
prend un paramètre de reconnaissance de geste, pas de reconnaissance de mouvement et je ne sais pas si c'est pour ça que je ne peux pas le faire fonctionner ou parce que je fais une erreur de syntaxe.Comment désactiver UIScrollView dans un système de reconnaissance de mouvements?
Je UIScrollView
subclassed et la méthode utilisée pour forcer FAIL dans le délégué ci-dessous:
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
}
}
Et voici le reconnaisseur pan geste qui a besoin de forcer le geste de reconnaissance dans le UIScrollView
à l'échec:
func addSomePanGestureRecognizer() {
SomePanGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(oneBPanGestureHandler(gesture:)))
oneBHandle.addGestureRecognizer(SomePanGestureRecognizer)
}
MISE À JOUR I a sous-classé le UIPanGestureRecognizer et l'a fait fonctionner en utilisant le délégué simultané mais je crains que ce soit une manière fragile de le faire parce que je compte sur UIKit pour toujours désactiver le UIScrollView avant le geste de panoramique personnalisé.
// 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
}
}
}
MISE À JOUR 2 Cela fonctionne aussi, mais je ne sais pas pourquoi, parce que je me sens comme il ne devrait pas. Ne devrait-il pas être l'inverse?
// force failure
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool {
if otherGestureRecognizer is CustomPanGestureRecognizer {
return true
} else {
return false
}
}
'UIPanGestureRecognizers' est une sous-classe de' UIGestureRecognizer'. Ce n'est pas le problème. – PeejWeej