iOS
UIScrollView avec enfant StackView
Recherche…
Un exemple complexe de StackView dans Scrollview
Voici un exemple de ce qui peut être fait avec StackViews imbriqués, donnant à l'utilisateur l'impression d'une expérience de défilement continu utilisant des éléments d'interface utilisateur ou des alignements complexes.
Prévention de la mise en page ambiguë
Une question fréquente à propos de StackViews dans Scrollviews provient des alertes ambiguës avec / heigh sur le générateur d'interface. Comme l'explique cette réponse , il est nécessaire de:
- Ajouter dans UIScrollView un UIView (le contentScrollView);
- Dans ce contentScrollView, définissez les marges supérieure, inférieure, gauche et droite sur 0
- Définir également aligner le centre horizontalement et verticalement;
Faire défiler le contenu à l'intérieur de StackViews imbriquées
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)
}