web-dev-qa-db-fra.com

Désactiver le geste pour dérouler la présentation modale de la feuille de formulaire / page

Dans iOS 13, les présentations modales utilisant le style de formulaire et de feuille de page peuvent être ignorées avec un mouvement panoramique vers le bas. C'est problématique dans une de mes feuilles de formulaire car l'utilisateur dessine dans cette case qui interfère avec le geste. Il tire l'écran vers le bas au lieu de tracer une ligne verticale.

Comment pouvez-vous désactiver le balayage vertical pour ignorer le geste dans un contrôleur de vue modale présenté sous forme de feuille?

Réglage isModalInPresentation = true permet toujours à la feuille d'être tirée vers le bas, elle ne sera tout simplement pas rejetée.

55
Jordan H

Moi, j'utilise ceci:

-(void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];

for(UIGestureRecognizer *gr in self.presentationController.presentedView.gestureRecognizers) {
    if (@available(iOS 11.0, *)) {
        if([gr.name isEqualToString:@"_UISheetInteractionBackgroundDismissRecognizer"]) {
            gr.enabled = false;
        }
    }
}
0
Emmanuel Crombez

J'essaierai de décrire la méthode 2 déjà suggérée par @Jordan H plus en détail:

1) Pour pouvoir capturer et prendre des décisions sur le mouvement de panoramique de la feuille modale, ajoutez ceci dans viewDidLoad du contrôleur de vue:

navigationController?.presentationController?.presentedView?.gestureRecognizers?.forEach {
   $0.delegate = self
}

2) Activez la possibilité d'attraper le mouvement de panoramique avec vos propres gestes en utilisant gestureRecognizer(_:shouldRecognizeSimultaneouslyWith:)

3) La décision réelle peut aller dans gestureRecognizer(_:shouldBeRequiredToFailBy:)

Exemple de code, qui fait que le geste de glissement est préféré au geste de panoramique de la feuille, si les deux sont présents. Il n'affecte pas le mouvement de panoramique d'origine dans les zones où il n'y a pas de reconnaissance de mouvement de balayage et donc le "balayage pour ignorer" d'origine peut toujours fonctionner comme prévu.

extension PeopleViewController: UIGestureRecognizerDelegate {

    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        if gestureRecognizer === UIPanGestureRecognizer.self && otherGestureRecognizer === UISwipeGestureRecognizer.self {
            return true
        }
        return false
    }

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

Dans mon cas, je n'ai que quelques reconnaisseurs de gestes de balayage, donc la comparaison des types me suffit, mais s'il y en a plus, il pourrait être judicieux de comparer les reconnaisseurs de gestes eux-mêmes (soit ceux ajoutés par programme ou en tant que sorties du constructeur d'interface) comme décrit dans ce document: https://developer.Apple.com/documentation/uikit/touches_presses_and_gestures/coordinating_multiple_gesture_recognizers/preferring_one_gesture_over_another

Voici comment fonctionne le code dans mon cas. Sans cela, le geste de balayage était généralement ignoré et ne fonctionnait qu'occasionnellement.

enter image description here

0
Vitalii