首页 > 解决方案 > 试图理解 iOS 中 AutoLayout 的渲染循环

问题描述

您好我正在尝试了解 WWDC 2018 高性能自动布局中引入的自动布局的渲染循环

他们说当引擎(自动布局)计算约束方程然后引擎将值通知给视图

At Last view call superview 调用setNeedsLayout

所以我试着检查一下

这是我的看法

在此处输入图像描述

BlueView 是 SuperView,GreenView 是 Subview

我覆盖setNeedsLayout,layoutSubviews和检查方法调用的draw顺序updateConstraints

结果是这样的

在此处输入图像描述

除了 4 次setNeedsLayoutCall 和 Only Superview 通话外,我能理解setNeedsLayout

这些是我的问题

  1. 为什么只有 SuperView 调用setNeedsLayout
  2. 为什么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")
    }
}

标签: iosuiviewautolayout

解决方案


在 layoutSubviews() 中 AutoLayout Engine 模型(使用约束计算)的 AutoLayout Engine 设置值

setNeedsLayout 在 superview 中调用,因为某些东西触发了这个。我认为这是因为在此之后更改层次结构(添加子视图)向子视图添加约束(这也是触发 setNeedsLayout),更改约束的优先级也会触发此。

  • 添加或删除子视图
  • 内在内容大小已更改
  • 激活或停用约束
  • 更改约束优先级

这点在 superview 中触发 setNeedsLayout()。

我希望这对你有帮助!


推荐阅读