Son zamanlarda bir UIStackView
. Bir sürü kitap tutma ve paketleme yığını yapmak yerine UIViews
, kendim için bir çıkış parentStackView
ve 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 arrangedSubviews
sırasıyla 0, 1, 2 ve 3'tür. Birini gizlemek istediğimde, onu parentStackView's
arrangedSubviews
diziden 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
arrangedSubviews
diziden 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 stackViewNumber2
sonra "göstermek" istiyorsanız, bunu istediğiniz parentStackView
arrangedSubViews
dizine 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 viewDidLoad
ve animasyonu kullanmadan güncelleyebilirsiniz view.layoutIfNeeded()
.