Niedawno zmagałem się z błędami automatycznego układu podczas ukrywania pliku UIStackView
. Zamiast zajmować się księgowaniem i pakowaniem stosów UIViews
, zdecydowałem się stworzyć ujście dla siebie parentStackView
i dla dzieci, które chcę ukryć / odkryć.
@IBOutlet weak var parentStackView: UIStackView!
@IBOutlet var stackViewNumber1: UIStackView!
@IBOutlet var stackViewNumber2: UIStackView!
Oto jak wygląda mój ParentStack w scenorysie:
Ma 4 dzieci i każde z nich ma w sobie kilka widoków stosu. Gdy ukryjesz widok stosu, jeśli zawiera on elementy interfejsu użytkownika, które są również widokami stosu, zobaczysz strumień błędów automatycznego układu. Zamiast się ukrywać, zdecydowałem się je usunąć.
W moim przykładzie parentStackViews
zawiera tablicę 4 elementów: widok górnego stosu, widok stosu, numer 1, widok stosu numer 2 i przycisk zatrzymania. Ich indeksy w arrangedSubviews
to odpowiednio 0, 1, 2 i 3. Kiedy chcę go ukryć, po prostu usuwam go z parentStackView's
arrangedSubviews
tablicy. Ponieważ nie jest słaby, pozostaje w pamięci i możesz później po prostu umieścić go z powrotem w wybranym indeksie. Nie uruchamiam go ponownie, więc po prostu wisi, dopóki nie będzie potrzebny, ale nie nadyma pamięci.
Więc w zasadzie możesz ...
1) Przeciągnij IBOutlets dla swojego stosu nadrzędnego i dzieci, które chcesz ukryć / odkryć, do scenorysu.
2) Jeśli chcesz je ukryć, usuń stos, który chcesz ukryć z parentStackView's
arrangedSubviews
tablicy.
3) Zadzwoń za self.view.layoutIfNeeded()
pomocą UIView.animateWithDuration
.
Zwróć uwagę, że ostatnie dwa stackViews nie są weak
. Musisz je mieć pod ręką, gdy je odkryjesz.
Powiedzmy, że chcę ukryć stackViewNumber2:
parentStackView.removeArrangedSubview(stackViewNumber2)
stackViewNumber2.removeFromSuperview()
Następnie animuj to:
UIView.animate(withDuration: 0.25,
delay: 0,
usingSpringWithDamping: 2.0,
initialSpringVelocity: 10.0,
options: [.curveEaseOut],
animations: {
self.view.layoutIfNeeded()
},
completion: nil)
Jeśli chcesz „odkryć” stackViewNumber2
później, możesz po prostu wstawić go do odpowiedniego parentStackView
arrangedSubViews
indeksu i animować aktualizację.
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)
Okazało się, że jest to o wiele łatwiejsze niż prowadzenie księgowości w zakresie ograniczeń, majstrowanie przy priorytetach itp.
Jeśli masz coś, co chcesz domyślnie ukryć, możesz po prostu ułożyć to w scenorysie, usunąć viewDidLoad
i zaktualizować bez użycia animacji view.layoutIfNeeded()
.