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

时间:2018-07-31 01:28:08

标签: ios uiview autolayout uiviewanimation

你好,我试图了解视图更新周期

我几乎可以理解所有事情,但是有些神秘的事情

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

为了尝试理解“动画”块中的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"

所以我知道动画块首先执行并更新视图,因此在更新周期中动画块的优先级高于视图更新

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

1 个答案:

答案 0 :(得分:0)

动画块中的内容(如果是可动画的)将在事务结束时的动画时间之前运行。

layoutIfNeeded可计为动画。它在动画块中的作用是:它使在代码中或通过layoutSubviews中的自动布局执行的帧等更改变为动画而不是立即显示。

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