나는 최근에 UIStackView
. 에서 많은 책을 보관하고 포장하는 대신 UIViews
, 나는 parentStackView
숨기거나 숨기고 싶은 아이들을위한 콘센트와 콘센트 를 만들기로 결정했습니다 .
@IBOutlet weak var parentStackView: UIStackView!
@IBOutlet var stackViewNumber1: UIStackView!
@IBOutlet var stackViewNumber2: UIStackView!
스토리 보드에서 내 parentStack은 다음과 같습니다.
여기에는 4 명의 자식이 있고 각 자식에는 내부에 스택 뷰가 있습니다. 스택 뷰를 숨길 때 스택 뷰인 UI 요소도 있으면 자동 레이아웃 오류 스트림이 표시됩니다. 숨기는 대신 제거하기로 결정했습니다.
내 예에서는 parentStackViews
Top Stack View, StackViewNumber1, Stack View Number 2 및 Stop Button의 4 개 요소 배열을 포함합니다. 인덱스는 arrangedSubviews
각각 0, 1, 2, 3입니다. 하나를 숨기고 싶을 때 간단히 parentStackView's
arrangedSubviews
배열 에서 제거합니다 . 약하지 않기 때문에 메모리에 남아 있으며 나중에 원하는 인덱스에 다시 넣을 수 있습니다. 나는 그것을 다시 초기화하지 않기 때문에 필요할 때까지 놀고 있지만 메모리를 부 풀리지 않습니다.
따라서 기본적으로 ...
1) 부모 스택과 숨기거나 숨기려는 자식에 대한 IBOutlets를 스토리 보드로 드래그합니다.
2) 숨기고 싶을 때, 숨기고 싶은 스택을 parentStackView's
arrangedSubviews
어레이 에서 제거합니다 .
3) 전화 self.view.layoutIfNeeded()
와 UIView.animateWithDuration
.
마지막 두 개의 stackView는 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()
있습니다.