5つのサブビューを持つUIStackView
があります。 intrinsicContentSize
を更新するか、制約を更新することにより、これらのサブビューの幅をアニメーション化できるようにしたいと考えています。サブビューのレイアウトを更新した後、stackViewを再描画するにはどうすればよいですか?
UIView.animateWithDuration(0.3, animations: {
viewToResize.compressed = true //changes intrinsicContentSize
viewToResize.invalidateIntrinsicContentSize()
self.stackView.layoutIfNeeded() //makes no difference
anotherSubview.hidden = true //adding this makes everything work
})
StackViewを更新しようとするさまざまな方法を試しましたが、何も起こりません。アニメーションブロック内で別のサブビューを表示/非表示にすると、新しいレイアウトが正しくアニメーション化されますが、これを行いたくありません。
私はこの質問を見ました Animating UIStackView measuredSubview content size change しかし、提案された回答が機能しません(アニメーションはありません)。
viewToResize.invalidateIntrinsicContentSize()
は必要ありません。代わりにサブビューの制約を更新してください。以下のコードでは、stackView
に2つのサブビューがあり、ストーリーボードからwidthConstraint
アウトレットを作成しています。次に、アニメーションブロックのwidthConstraint
の定数を更新して、サブビューの幅をアニメーション化できます。 注:ビューがスタックビューに含まれている場合、ビューフレームを変更しようとしても変更されません
class ViewController: UIViewController {
@IBOutlet var widthConstraint: NSLayoutConstraint!
@IBOutlet var stackView: UIStackView!
var compressed: Bool = true
@IBOutlet var start: UIButton!
@IBAction func onStart(sender: UIButton) {
UIView.animateWithDuration(3.0,
delay: 0.0,
usingSpringWithDamping: 0.3,
initialSpringVelocity: 10.0,
options: .CurveLinear,
animations: { () -> Void in
//self.stackView.invalidateIntrinsicContentSize()
self.widthConstraint.constant = (self.compressed == false) ? 100.0 : 200.0
self.compressed = !self.compressed
self.view.layoutIfNeeded()
}, completion: nil)
}
詳細については、この素晴らしいブログをご覧ください IStackView、自動レイアウト、コアアニメーション