最近、を非表示にすると、自動レイアウトエラーが発生しましたUIStackView
。一連の本を保管してスタックをラッピングするのではなく、UIViews
自分parentStackView
用のアウトレットと、非表示/再表示したい子供用のアウトレットを作成することを選択しました。
@IBOutlet weak var parentStackView: UIStackView!
@IBOutlet var stackViewNumber1: UIStackView!
@IBOutlet var stackViewNumber2: UIStackView!
ストーリーボードでは、parentStackは次のようになります。
4つの子があり、それぞれの子の中にスタックビューの束があります。スタックビューを非表示にすると、スタックビューであるUI要素もある場合、自動レイアウトエラーのストリームが表示されます。非表示にするのではなく、それらを削除することを選択しました。
私の例でparentStackViews
は、4つの要素の配列が含まれています:Top Stack View、StackViewNumber1、Stack View Number 2、およびStop Button。のインデックスはarrangedSubviews
それぞれ0、1、2、3です。非表示にする場合は、parentStackView's
arrangedSubviews
配列から削除するだけです。弱くないわけではないので、メモリに残り、後で目的のインデックスに戻すことができます。私はそれを再初期化していないので、必要になるまでハングアウトしますが、メモリを膨らませません。
だから基本的には...
1)親スタックと非表示/再表示したい子のIBOutletsをストーリーボードにドラッグします。
2)それらを非表示にする場合は、非表示にするスタックをparentStackView's
arrangedSubviews
配列から削除します。
3)で電話self.view.layoutIfNeeded()
しUIView.animateWithDuration
ます。
最後の2つの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()
ます。