Question

J'utilise UIScrollView pour faire de grande taille (plus grand que 320px) UI sur iPhone.

J'ai fait une instance de UIScrollView et ajouté quelques sous-vues là-dessus. Le problème est que je veux activer le défilement uniquement lorsque l'utilisateur touche l'extérieur du sous-vues, arrêter le défilement lorsque l'utilisateur touche l'un des sous-vues.

Je lis des documents et essayé de trouver des échantillons, mais je ne peux pas trouver bon conseil. Si vous avez une idée, s'il vous plaît me aider.

Était-ce utile?

La solution

Si vous voulez détecter des touches dans l'un des sous-vues du UIScrollView, vous devrez sous-classe UIScrollView et remplacer les méthodes de touchesShouldBegin et touchesShouldCancelInContentView qui sont spécifiquement créés à cet effet.

Autre que cela, il n'y a aucun moyen que vous pouvez identifier des touches dans les sous-vues comme UIScrollView a tendance à traiter toutes les touches lui-même et ne les transmet pas ses sous-vues.

Bonne chance.

Autres conseils

UIScrollView a une scrollEnabled propriété qui vous permet de désactiver le défilement par programmation. Il dispose également d'un délégué (UIScrollViewDelegate) qui vous permet de voir des événements tels que le défilement début / fin. Il semble que vous devriez être en mesure de faire cuire quelque chose avec ces options combinées d'une certaine façon.

La propriété que vous êtes vraiment intéressé - et je teste en fait ceci en ce moment, parce que j'ai le même problème que vous faites - est canCancelContentTouches.

  

Si la valeur de cette propriété est NON,   la vue de défilement ne défile pas   quel que soit le mouvement des doigts une fois que la   afficher le contenu commence le suivi.

Si cela ne vous donne pas les résultats que vous voulez, la sous-classe UIScrollView et passer outre la méthode touchesShouldBegin:withEvent:inContentView, qui est ce que la réponse acceptée suggère.

La façon la plus simple de le faire est mis delayContentTouches à NO pour le scrollview. De cette façon, le comportement par défaut est réglé de telle sorte que tout ce qui est un UIControl passera les touches sur la commande immédiatement andeverything autre défilera.

Vous pouvez également sublcass UIScrollViewController et passer outre la touchesBegan, touchesMoved et méthodes touchesEnded. Si votre implémentation appelle jamais la mise en œuvre superclasse, il ne défile pas.

Mon problème était d'avoir une vue qu'un utilisateur pourrait dessiner mais la vue de défilement a été Détournement la touche et le défilement au lieu du dessin. Ceci est ma solution de travail:

À mon avis dessin je:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

    // Disable scroll on touch begin
    setContainerScrollingEnabled(false)
    super.touchesBegan(touches, with: event)
}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {

    // Reenable scroll on touch end
    setContainerScrollingEnabled(true)
    super.touchesEnded(touches, with: event)
}

private func setContainerScrollingEnabled(_ enabled: Bool) {

    // loop up superviews to find the scrollview
    func scrollingSuperview(of view: UIView) -> UIScrollView? {
        guard let superview = view.superview else { return nil }
        if let scrolling = view.superview as? UIScrollView { return scrolling }
        return scrollingSuperview(of: superview)
    }

    // and switch on/off scrolling
    let scrollView = scrollingSuperview(of: self)
    scrollView?.isScrollEnabled = enabled
}

et dans le contrôleur de vue contenant la vue de défilement J'ai:

// Not sure what exactly this does, but I think it allows the drawing view to have precedence. This was the missing piece of the puzzle.
scrollView.delaysContentTouches = false
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top