Son zamanlarda bir UIStackView. Bir sürü kitap tutma ve paketleme yığını yapmak yerine UIViews, kendim için bir çıkış parentStackViewve saklamak / göstermek istediğim çocuklar için bir çıkış yeri oluşturmayı seçtim .
@IBOutlet weak var parentStackView: UIStackView!
@IBOutlet var stackViewNumber1: UIStackView!
@IBOutlet var stackViewNumber2: UIStackView!
Film şeridinde, parentStack'im şöyle görünüyor:

4 çocuğu var ve her çocuğun içinde bir sürü yığın manzarası var. Bir yığın görünümünü gizlediğinizde, aynı zamanda yığın görünümleri olan UI öğeleri de varsa, bir otomatik düzen hataları akışı görürsünüz. Gizlemek yerine onları kaldırmayı seçtim.
Benim örnekte, parentStackViewsÜst Stack View, StackViewNumber1, Stack Görünüm Sayı 2 ve Durdur Düğmesi: 4 element dizisi içerir. Endeksleri arrangedSubviewssırasıyla 0, 1, 2 ve 3'tür. Birini gizlemek istediğimde, onu parentStackView's arrangedSubviewsdiziden kaldırırım . Zayıf olmadığı için hafızada kalır ve daha sonra istediğiniz dizine geri koyabilirsiniz. Yeniden başlatmıyorum, bu yüzden ihtiyaç duyulana kadar takılıyor ama hafızayı şişirmiyor.
Yani temelde şunları yapabilirsiniz ...
1) Ana yığınınız ve gizlemek / göstermek istediğiniz çocuklar için IBOutlets'i storyboard'a sürükleyin.
2) Onları gizlemek istediğinizde, parentStackView's arrangedSubviewsdiziden gizlemek istediğiniz yığını kaldırın .
3) Çağrı self.view.layoutIfNeeded()ile UIView.animateWithDuration.
Son iki stackView'in olmadığını unutmayın weak. Onları ortaya çıkardığın zaman etrafta tutmalısın.
StackViewNumber2'yi gizlemek istediğimi varsayalım:
parentStackView.removeArrangedSubview(stackViewNumber2)
stackViewNumber2.removeFromSuperview()
Sonra onu canlandırın:
UIView.animate(withDuration: 0.25,
delay: 0,
usingSpringWithDamping: 2.0,
initialSpringVelocity: 10.0,
options: [.curveEaseOut],
animations: {
self.view.layoutIfNeeded()
},
completion: nil)
Daha stackViewNumber2sonra "göstermek" istiyorsanız, bunu istediğiniz parentStackView arrangedSubViewsdizine ekleyebilir ve güncellemeyi canlandırabilirsiniz.
parentStackView.removeArrangedSubview(stackViewNumber1)
stackViewNumber1.removeFromSuperview()
parentStackView.insertArrangedSubview(stackViewNumber2, at: 1)
UIView.animate(withDuration: 0.25,
delay: 0,
usingSpringWithDamping: 2.0,
initialSpringVelocity: 10.0,
options: [.curveEaseOut],
animations: {
self.view.layoutIfNeeded()
},
completion: nil)
Bunun, kısıtlamalar üzerinde muhasebe yapmaktan, önceliklerle uğraşmaktan vb. Çok daha kolay olduğunu buldum.
Varsayılan olarak gizlenmesini istediğiniz bir şey varsa, bunu film şeridine yerleştirip kaldırabilir viewDidLoadve animasyonu kullanmadan güncelleyebilirsiniz view.layoutIfNeeded().