布局iOS面试&笔试知识积累

iOS 自动布局总结篇

2018-01-11  本文已影响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有要求的话。

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

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

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


最后总结一张图:

上一篇下一篇

猜你喜欢

热点阅读