Нещодавно я боровся з помилками автоматичної розкладки, приховуючи файл 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()
.