iOS Faire défiler le contenu à l'intérieur de StackViews imbriquées


Exemple

Le gros truc sur le défilement consiste à déterminer le décalage nécessaire pour présenter (par exemple) un Textfield dans un StackView avec est à l'intérieur de ScrollView .

Si vous essayez d'obtenir la position de Textfield.frame.minY peut être 0 , car le frame minY ne prend en compte que la distance entre l'élément et le sommet du StackView. Donc, vous devez tenir compte de toutes les autres vues / vues de la pile parente.

Une bonne solution consiste à:

1 - Implémenter l'extension ScrollView

extension UIScrollView {

    func scrollToShowView(view: UIView){
        var offset = view.frame.minY
        var superview = view.superview
        while((superview  != nil)){
            offset += (superview?.frame.minY)!
            superview = superview?.superview
        }
        
        offset -= 100 //optional margin added on offset
        
        self.contentOffset = CGPoint.init(x: 0, y: offset)
    }

}

Cela prendra en compte toutes les vues parentes et la somme des décalages nécessaires pour la vue de défilement présente la vue nécessaire à l'écran (par exemple, un champ de texte qui ne peut pas rester derrière le clavier de l'utilisateur)

Exemple d'utilisation:

func textViewDidBeginEditing(_ textView: UITextView) {
    self.contentScrollView.scrollToShowView(view: textView)
}