web-dev-qa-db-fra.com

Contrôle segmenté iOS 13: supprimez le geste de balayage pour sélectionner le segment

TLDR: Comment supprimer le reconnaisseur de mouvement de balayage/panoramique pour UISegmentedControl sur iOS 13?

Salut, sur iOS 13, beaucoup de choses ont changé avec UISegmentedControl. La plupart du temps, les modifications étaient basées sur l'apparence. Mais il y a un autre changement de fonctionnalité qui gâche mon application.

Sur iOS 13, avec UISegmentedControls, vous pouvez maintenant glisser/déplacer pour modifier le segment sélectionné en plus de toucher le segment que vous souhaitez sélectionner.

Dans mon application, j'ai essentiellement un UISegmentedControl intégré dans une vue de défilement. L'UISegmentedControl est trop long pour que l'écran affiche toutes les valeurs, j'ai donc créé une vue de défilement qui est la largeur de l'écran, dont la largeur du contenu est la longueur de l'UISegmentedControl, et pour accéder aux segments non visibles, l'utilisateur glisse la "scrollview" et les diapositives de contrôle segmentées.

Cela a fonctionné parfaitement jusqu'à iOS 13, et maintenant, l'utilisateur ne peut pas faire défiler la vue de défilement horizontale d'arrière-plan tout en faisant glisser le contrôle segmenté parce que je suppose que la reconnaissance de défilement de défilement est remplacée par le nouveau balayage de défilement pour sélectionner le geste.

J'ai même essayé de supprimer TOUS les reconnaisseurs de gestes pour UISegmentedControl et toutes ses sous-vues de manière récursive, et le balayage pour modifier le geste de sélection fonctionne toujours ... Je suis coincé.

Merci, faites-moi savoir si le problème n'est pas clair

7
user3492226

J'ai mis à jour la réponse de @ Aystub. Vous pouvez uniquement autoriser UITapGestureRecogniger à sélectionner un segment.

class NoSwipeSegmentedControl: UISegmentedControl {
        override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {

            if(gestureRecognizer.isKind(of: UITapGestureRecognizer.self)){
                return false
            }else{
                return true
            }

       }
}
0
mazend