Нещодавно я боровся з помилками автоматичної розкладки, приховуючи файл UIStackView. Замість того, щоб робити купу книжок для ведення книг та загортання UIViews, я вирішив створити торгову точку для своїх parentStackViewта торгові точки для дітей, яких хочу сховати / показати.
@IBOutlet weak var parentStackView: UIStackView!
@IBOutlet var stackViewNumber1: UIStackView!
@IBOutlet var stackViewNumber2: UIStackView!
У розкадровці ось як виглядає my parentStack:

У ньому 4 дитини, і у кожного з них є купа виглядів стека всередині них. Якщо ви приховуєте подання стека, якщо в ньому є елементи інтерфейсу, які також є переглядами стека, ви побачите потік помилок автоматичного розміщення. Замість того, щоб приховувати, я вирішив їх видалити.
У моєму прикладі parentStackViewsмістить масив з 4 елементів: Вид зверху стека, StackViewNumber1, номер стека номер 2 і кнопка зупинки. Їх показники arrangedSubviewsскладають 0, 1, 2 та 3 відповідно. Коли я хочу сховати один, я просто видаляю його з parentStackView's arrangedSubviewsмасиву. Оскільки він не слабкий, він залишається в пам'яті, і ви можете просто повернути його назад до бажаного індексу пізніше. Я не повторно ініціалізую його, тому він просто висить, доки це не потрібно, але не здуває пам’ять.
Отже, ви можете ...
1) Перетягніть IBOutlets для вашого батьківського стеку та дітей, яких ви хочете сховати / показати, на розкадрування.
2) Коли ви хочете їх приховати, видаліть стек, який ви хочете сховати, з parentStackView's arrangedSubviewsмасиву.
3) Телефонуйте за self.view.layoutIfNeeded()допомогою UIView.animateWithDuration.
Зверніть увагу, що останні два stackViews не є weak. Вам потрібно тримати їх поруч, коли ви їх показуєте.
Скажімо, я хочу приховати stackViewNumber2:
parentStackView.removeArrangedSubview(stackViewNumber2)
stackViewNumber2.removeFromSuperview()
Потім анімуйте це:
UIView.animate(withDuration: 0.25,
delay: 0,
usingSpringWithDamping: 2.0,
initialSpringVelocity: 10.0,
options: [.curveEaseOut],
animations: {
self.view.layoutIfNeeded()
},
completion: nil)
Якщо ви хочете "показати" stackViewNumber2пізніше, ви можете просто вставити його у потрібний parentStackView arrangedSubViewsіндекс і анімувати оновлення.
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)
Я виявив, що набагато простіше, ніж вести бухгалтерію з обмеженнями, возитися з пріоритетами тощо.
Якщо у вас є щось, що ви хочете приховати за замовчуванням, ви можете просто викласти це на розкадруванні та видалити його viewDidLoadта оновити без використання анімації view.layoutIfNeeded().