4
votes

Le geste de balayage interrompt le contrôle UISlider dans iOS 13, mais pas dans les versions iOS précédentes

Remarque: il s'agit de la version bêta d'iOS 13, mais pourrait également s'appliquer à la version officielle de demain.

Mise à jour 2: je l'ai remplacé par une image de pouce plus grande et j'ai toujours un problème.

Mise à jour: il semble qu'il contrôle toujours en permanence si je suis super précis sur le fait de toucher le pouce sur le curseur. Mais pourquoi cela a-t-il changé et comment puis-je le faire contrôler comme avant?

J'ai un outil de reconnaissance de geste par balayage ajouté à ma vue:

        let slider = UISlider()
        let sliderLength:CGFloat = 175
        slider.frame = CGRect(x:0,
                              y:CGFloat(customHeight) - 35,
                              width:sliderLength,
                              height:35)


        slider.minimumValue = -1.2 
        slider.maximumValue = 0.6
        slider.setValue(Float(snowSliderValAdder), animated: false)

        slider.addTarget(self, action: #selector(self.updateSnowSliderValue(_:)), for: .valueChanged)

        view.addSubview(slider)

Plus tard, j'ajoute un UISlider à la même vue:

    let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(self.respondToSwipeGesture))
    swipeRight.direction = UISwipeGestureRecognizer.Direction.right
    self.view.addGestureRecognizer(swipeRight)

Ce qui fonctionnait bien, maintenant se comporte mal sous iOS 13. Je peux déplacer le pouce sur le curseur si je le déplace très lentement, mais si je fais un mouvement de balayage, le pouce sur le curseur cesse de bouger et le geste est déclenché. Comment puis-je empêcher cela?


5 commentaires

Le curseur est-il dans un contrôleur de vue modale de carte? Le geste de rejet peut interférer avec votre geste de glissement.


Avez-vous essayé d'implémenter gestureRecognizer(_:shouldReceive:) pour vérifier si le balayage s'est produit sur le curseur, et si oui, renvoyer false?


@Gereon - Je l'ai fait fonctionner maintenant. J'avais besoin d'ajouter UIGestureRecognizerDelegate à ma vue et d'attribuer le délégué de balayage à soi-même.


Je suis curieux de voir la solution - pourquoi ne la postez-vous pas comme réponse?


Salut @Gereon J'ai ajouté une réponse.


4 Réponses :


21
votes

J'ai eu le même problème et j'ai réussi à le résoudre en procédant comme suit:

Ajoutez un panGesture, qui ne fait rien, à vos curseurs et définissez leur propriété cancelsTouchesInView sur false.

let panGesture = UIPanGestureRecognizer(target: nil, action:nil)
                    panGesture.cancelsTouchesInView = false
                    slider.addGestureRecognizer(panGesture)

Maintenant, vos curseurs devraient glisser comme un couteau coupant un beurre sans interruption de balayage.


4 commentaires

D'où avez-vous obtenu votre diplôme? Poudlard?


Cela ne fonctionne pas (mai 2020) et semble très "hack-y". Quelle est la bonne façon de procéder?


Ce thread SO a la bonne réponse qui montre la bonne façon de le faire - stackoverflow.com/questions/4765661/...


Tu as sauvé ma journée! Merci!



1
votes

J'ai essayé de trouver quelque chose au cours de la dernière heure. Cela ressemble à la reconnaissance de geste de balayage comme une interférence avec UISlider.

Le problème n'apparaît que si vous utilisez la direction droite / gauche. Vous devriez peut-être attendre avant de mettre à jour votre application ou de modifier votre interface utilisateur pour utiliser le geste de balayage haut / bas.

À ce stade, le curseur fonctionne normalement si vous attendez un peu avant de bouger votre doigt. En espérant qu'Apple le réparera rapidement.


0 commentaires

1
votes

Ce que j'ai fait, c'est d'utiliser une fonction gestureRecognizer pour arrêter tous les gestes si un contact était détecté sur mes UISliders. Assurez-vous d'ajouter UIGestureRecognizerDelegate et définissez le délégué de UISwipeGestureRecognizer sur self.

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {

   if touch.view == self.view.viewWithTag(viewTags.MySlider.rawValue) {
        return false
   }
   else if touch.view == self.view.viewWithTag(viewTags.AnotherSlider.rawValue) {
        return false
   }

   return true
}


0 commentaires

0
votes

SWIFT 5

Le problème peut être résolu en utilisant la méthode déléguée de gesturerecognizer comme ci-dessous

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
    if touch.view?.isKind(of: UISlider.self) ?? false {
        return false
    } else {
        return true
    }
}


0 commentaires