ios - 试图理解 iOS 中 AutoLayout 的渲染循环
问题描述
您好我正在尝试了解 WWDC 2018 高性能自动布局中引入的自动布局的渲染循环
他们说当引擎(自动布局)计算约束方程然后引擎将值通知给视图
At Last view call superview 调用setNeedsLayout
所以我试着检查一下
这是我的看法
BlueView 是 SuperView,GreenView 是 Subview
我覆盖setNeedsLayout
,layoutSubviews
和检查方法调用的draw
顺序updateConstraints
结果是这样的
除了 4 次setNeedsLayout
Call 和 Only Superview 通话外,我能理解setNeedsLayout
这些是我的问题
- 为什么只有 SuperView 调用
setNeedsLayout
- 为什么
setNeedsLayout
在这种情况下调用 4 次
这是我的代码
class SuperView: UIView {
override func updateConstraints() {
super.updateConstraints()
print("SuperView : updateConstraints")
}
override func setNeedsLayout() {
super.setNeedsLayout()
print("SuperView : setNeedsLayout")
}
override func layoutSubviews() {
super.layoutSubviews()
print("SuperView : layoutSubviews")
}
override func draw(_ rect: CGRect) {
super.draw(rect)
print("SuperView : draw")
}
}
class SubView: UIView {
override func updateConstraints() {
super.updateConstraints()
print("SubView : updateConstraints")
}
override func setNeedsLayout() {
super.setNeedsLayout()
print("SubView : setNeedsLayout")
}
override func layoutSubviews() {
super.layoutSubviews()
print("SubView : layoutSubviews")
}
override func draw(_ rect: CGRect) {
super.draw(rect)
print("SubView : draw")
}
}
解决方案
在 layoutSubviews() 中 AutoLayout Engine 模型(使用约束计算)的 AutoLayout Engine 设置值
setNeedsLayout 在 superview 中调用,因为某些东西触发了这个。我认为这是因为在此之后更改层次结构(添加子视图)向子视图添加约束(这也是触发 setNeedsLayout),更改约束的优先级也会触发此。
- 添加或删除子视图
- 内在内容大小已更改
- 激活或停用约束
- 更改约束优先级
这点在 superview 中触发 setNeedsLayout()。
我希望这对你有帮助!
推荐阅读
- r - 在混合模型图中将两个图合并为一个图
- javascript - 使用 ```localStorage``` 在 Javascript 中存储动态创建的按钮
- excel - 对具有特定条件的excel表进行排序(vba)
- let - 使用 KQL 'let' 在同一个表中组合两个查询
- bash - Bash - 简单问号 (?) 的含义
- java - 单击listview Android(Java)时出错
- qt - 如何解决 qml 模块未找到(qml 设计器)
- c++ - cmake:如何避免在运行 make install 时安装 FetchContent 和 FetchContent_MakeAvailable 的依赖项
- android - 我希望用户从设备中选择图像然后自己将其作为位图处理,我如何在内容提供商的帮助下实现这一点?
- r - 如何使用 ggplot 为 GLM 模型制作效果图?