关于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
中以代码或自动布局执行的帧等变化被动画化而不是立即发生。
基本上,这是一种将下一个布局时刻包裹在动画中的方法。
您好,我想了解视图更新周期
我能看懂大部分的东西,但有些东西很神秘
我了解到动画块也会在更新周期触发
为了理解动画块中的 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
中以代码或自动布局执行的帧等变化被动画化而不是立即发生。
基本上,这是一种将下一个布局时刻包裹在动画中的方法。