你好,我试图了解视图更新周期
我几乎可以理解所有事情,但是有些神秘的事情
我了解到动画块也会在更新周期触发
为了尝试理解“动画”块中的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"
所以我知道动画块首先执行并更新视图,因此在更新周期中动画块的优先级高于视图更新
是吗?如果我错了,我想了解视图的更新周期与动画块之间的关系
答案 0 :(得分:0)
动画块中的内容(如果是可动画的)将在事务结束时的动画时间之前运行。
layoutIfNeeded
可计为动画。它在动画块中的作用是:它使在代码中或通过layoutSubviews
中的自动布局执行的帧等更改变为动画而不是立即显示。
基本上,这是一种在动画中包装下一个布局时刻的方法。