关于iOS约束更新动画——动画块+layoutIfNeeded

About iOS Constraint update Animation - Animation block + layoutIfNeeded

您好,我想了解视图更新周期

我能看懂大部分的东西,但有些东西很神秘

我了解到动画块也会在更新周期触发

为了理解动画块中的 layoutIfNeeded,我写了一些示例代码,如下所示

class MyView: UIView {
    override func layoutSubviews() {
        super.layoutSubviews()
        print("Layout Subviews")
    }
}
class ViewController: UIViewController {

    @IBOutlet weak var blueHeight: NSLayoutConstraint!

    @IBAction func heightPressed(_ sender: AnyObject) {

        if self.blueHeight.constant == 25.0 {
            self.blueHeight.constant = self.view.bounds.height - 100.0
        } else {
            self.blueHeight.constant = 25.0
        }

        self.view.setNeedsLayout()
        UIView.animate(withDuration: 2.0, animations: {
            print("animation block")
            self.view.layoutIfNeeded() // ----- **
        }) { (_) in
            print("animation ended")
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

输出是这样的

"Layout Subviews"
"Layout Subviews" ---- because of initial settings 
"Animation block"
"Layout Subviews"
"Animation ended"

但是当我将 layoutIfNeeded 更改为 setNeedsLayout 时,输出发生了变化

"Layout Subviews"
"Layout Subviews" ---- because of initial settings 
"Animation block"
"Animation ended"
"Layout Subviews"

所以我理解动画块先执行然后视图更新,所以动画块在更新周期中比视图的更新具有更高的优先级

是吗?如果我错了,我想了解视图的更新周期和动画块之间的关系

动画块中的内容,如果它是可动画的,则不会 运行 直到事务结束时的动画时间。

layoutIfNeeded 算作动画。它在动画块中的作用是:它导致在 layoutSubviews 中以代码或自动布局执行的帧等变化被动画化而不是立即发生。

基本上,这是一种将下一个布局时刻包裹在动画中的方法。