2017-09-01 3 views
0

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 
    } 

} 
+0

'UIPanGestureRecognizers' est une sous-classe de' UIGestureRecognizer'. Ce n'est pas le problème. – PeejWeej

Répondre

0

Je crois que c'est ce que vous cherchez:

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

Erreur de compilation: SomePanGestureRecognizer est un type non déclaré – sconewolf

+0

C'est la classe que vous avez spécifiée. Utilisez n'importe quelle sous-classe. – PeejWeej

+0

Je veux que le reconnaisseur de gestes sans nom dans l'UIScrollView échoue à l'outil de reconnaissance de mouvements Pan SomePanGestureRecognizer. Nous ne devons pas être sur la même longueur d'onde, car cela ne fonctionne pas. – sconewolf