J'ai récemment lutté contre des erreurs de mise en page automatique en masquant un fichier UIStackView
. Plutôt que de faire un tas de piles de livres et d'emballage UIViews
, j'ai choisi de créer un point de vente pour mes parentStackView
et des points de vente pour les enfants que je veux cacher / afficher.
@IBOutlet weak var parentStackView: UIStackView!
@IBOutlet var stackViewNumber1: UIStackView!
@IBOutlet var stackViewNumber2: UIStackView!
Dans le storyboard, voici à quoi ressemble mon parentStack:
Il a 4 enfants et chacun des enfants a un tas de vues de pile à l'intérieur d'eux. Lorsque vous masquez une vue de pile, si elle contient des éléments d'interface utilisateur qui sont également des vues de pile, vous verrez un flux d'erreurs de disposition automatique. Plutôt que de me cacher, j'ai choisi de les supprimer.
Dans mon exemple, parentStackViews
contient un tableau des 4 éléments: Top Stack View, StackViewNumber1, Stack View Number 2 et Stop Button. Leurs indices enarrangedSubviews
sont 0, 1, 2 et 3, respectivement. Lorsque je veux en cacher un, je le supprime simplement du parentStackView's
arrangedSubviews
tableau. Comme il n'est pas faible, il reste en mémoire et vous pouvez simplement le remettre à l'index souhaité plus tard. Je ne le réinitialise pas, donc il se bloque jusqu'à ce qu'il soit nécessaire, mais ne gonfle pas la mémoire.
Donc, fondamentalement, vous pouvez ...
1) Faites glisser IBOutlets pour votre pile parent et les enfants que vous souhaitez masquer / afficher dans le storyboard.
2) Lorsque vous souhaitez les masquer, supprimez la pile que vous souhaitez masquer du parentStackView's
arrangedSubviews
tableau.
3) Appelez self.view.layoutIfNeeded()
avec UIView.animateWithDuration
.
Notez que les deux derniers stackViews ne le sont pas weak
. Vous devez les conserver lorsque vous les affichez.
Disons que je veux masquer stackViewNumber2:
parentStackView.removeArrangedSubview(stackViewNumber2)
stackViewNumber2.removeFromSuperview()
Puis animez-le:
UIView.animate(withDuration: 0.25,
delay: 0,
usingSpringWithDamping: 2.0,
initialSpringVelocity: 10.0,
options: [.curveEaseOut],
animations: {
self.view.layoutIfNeeded()
},
completion: nil)
Si vous souhaitez "afficher" une version stackViewNumber2
ultérieure, vous pouvez simplement l'insérer dans l' parentStackView
arrangedSubViews
index souhaité et animer la mise à jour.
parentStackView.removeArrangedSubview(stackViewNumber1)
stackViewNumber1.removeFromSuperview()
parentStackView.insertArrangedSubview(stackViewNumber2, at: 1)
// Then animate it
UIView.animate(withDuration: 0.25,
delay: 0,
usingSpringWithDamping: 2.0,
initialSpringVelocity: 10.0,
options: [.curveEaseOut],
animations: {
self.view.layoutIfNeeded()
},
completion: nil)
J'ai trouvé que c'était beaucoup plus facile que de faire de la comptabilité sur les contraintes, de jouer avec les priorités, etc.
Si vous souhaitez masquer quelque chose par défaut, vous pouvez simplement le disposer sur le storyboard, le supprimer viewDidLoad
et le mettre à jour sans utiliser l'animation view.layoutIfNeeded()
.