web-dev-qa-db-ja.com

UIStackViewのレイアウトを更新するにはどうすればよいですか?

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 しかし、提案された回答が機能しません(アニメーションはありません)。

9
James P

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、自動レイアウト、コアアニメーション

8
billphilip22