iOS 自动布局总结篇

作者: 人魔七七 | 来源:发表于2018-01-11 15:08 被阅读586次

    前几篇已经讲述了代码 SB/xib 设置自动布局,并且介绍了几个特殊的例子。现在总结下。

    自动布局的生命周期:

    借用一张图介绍

    官网视频中的PPT介绍

    一一说明:Constraints  Change  Deferred Layout Pass

    Constraints  Change 

    约束的改变主要有下面几点引起:

    1:激活或者相反的状态

    2:改变约束的值

    3:改变约束的优先级

    4:改变View视图层的结构比如移除掉一个View或者改变层次

    5:其他的比如改变一个控件的属性

    Deferred Layout Pass

    一张图说明下Deferred Layout Pass

    主要下面两个过程

    1:系统遍历View的层级结构并且调用所有控制器的updateViewConstraint方法或者所有的View的updateConstraint方法。然后你可以重写这个方法来自定义自己的约束。

    注意注释部分

    2:系统遍历View的层级结构调用所有控制器的ViewWillLayoutSubviews或者所有View的layoutSubViews。默认的layoutSubViews方法更新每个View的frame通过自动布局。你可以通过重写一些方法更改布局,这就是自定义布局的实现方式,注意为什么开始结束都要调用父类方法。

    注意注释部分

    注意:不要直接调用,通过其他方法触发,调用setNeedsLayout 方法或者 setNeedsUpdateConstraints方法。

    举个例子

    注意注释部分

    其实通过setNeedsUpdateConstraints 触发,是批处理的一个表现,因为性能原因我们需要批量更新。他会标记约束,并且布局引擎将要重新在下一个循环中计算约束并调用updateConstraints方法去改变约束,注意一点最后要调用父类方法的实现,[super  updateConstraints ]。

    setNeedsLayout 有时候你改变了一些布局,系统不能自己标记这个布局,你又不能自己直接访问这个布局的flag,这是你就要调用这个方法标记下这个布局,然后会在在下一个布局循环中重新计算稍后会调用layoutSubViews方法。注意你必须调用父类方法[super layoutSubViews]如果你要对frame有要求的话。

    有时候需要马上更新约束布局

    比如你做动画的时候需要立即更新约束布局

    注意注释部分 有时候等不及下个循环马上在这个循环更新约束布局


    最后总结一张图:

    相关文章

      网友评论

        本文标题:iOS 自动布局总结篇

        本文链接:https://www.haomeiwen.com/subject/jemonxtx.html