iOS中AutoLayer自动布局流程及相关方法

关于UIView的Layer,IOS提供了三个方法:spring

一、layoutSubviews布局

在iOS5.1和以前的版本,此方法的缺省实现不会作任何事情(实现为空),iOS5.1以后(iOS6开始)的版本,此方法的缺省实现是使用你设置在此view上面的constraints(Autolayout)去决定subviews的position和size。 UIView的子类若是须要对其subviews进行更精确的布局,则能够重写此方法。只有在autoresizingconstraint-based behaviors of subviews不能提供咱们想要的布局结果的时候,咱们才应该重写此方法。能够在此方法中直接设置subviews的frame。 咱们不该该直接调用此方法,而应当用下面两个方法。.net

二、setNeedsLayoutcode

此方法会将view当前的layout设置为无效的,并在下一个upadte cycle里去触发layout更新。get

三、layoutIfNeededit

使用此方法强制当即进行layout,从当前view开始,此方法会遍历整个view层次(包括superviews)请求layout。所以,调用此方法会强制整个view层次布局。io

 

基于约束的AutoLayer的方法:sed

一、setNeedsUpdateConstraints渲染

当一个自定义view的某个属性发生改变,而且可能影响到constraint时,须要调用此方法去标记constraints须要在将来的某个点更新,系统而后调用updateConstraints.date

二、needsUpdateConstraints

constraint-based layout system使用此返回值去决定是否须要调用updateConstraints做为正常布局过程的一部分。

三、updateConstraintsIfNeeded

当即触发约束更新,自动更新布局。

四、updateConstraints

 

自定义view应该重写此方法在其中创建constraints. 注意:要在实如今最后调用[super updateConstraints]

 

Auto Layout Process 自动布局过程

与使用springs and struts(autoresizingMask)比较,Auto layout在view显示以前,多引入了两个步骤:updating constraints 和laying out views。每个步骤都依赖于上一个。display依赖layout,而layout依赖updating constraints。 updating constraints->layout->display

第一步:updating constraints,被称为测量阶段,其从下向上(from subview to super view),为下一步layout准备信息。能够经过调用方法setNeedUpdateConstraints去触发此步。constraints的改变也会自动的触发此步。可是,当你自定义view的时候,若是一些改变可能会影响到布局的时候,一般须要本身去通知Auto layout,updateConstraintsIfNeeded。

自定义view的话,一般能够重写updateConstraints方法,在其中能够添加view须要的局部的contraints。

第二步:layout,其从上向下(from super view to subview),此步主要应用上一步的信息去设置view的center和bounds。能够经过调用setNeedsLayout去触发此步骤,此方法不会当即应用layout。若是想要系统当即的更新layout,能够调用layoutIfNeeded。另外,自定义view能够重写方法layoutSubViews来在layout的工程中获得更多的定制化效果。

第三步:display,此步时把view渲染到屏幕上,它与你是否使用Auto layout无关,其操做是从上向下(from super view to subview),经过调用setNeedsDisplay触发,

由于每一步都依赖前一步,所以一个display可能会触发layout,当有任何layout没有被处理的时候,同理,layout可能会触发updating constraints,当constraint system更新改变的时候。

须要注意的是,这三步不是单向的,constraint-based layout是一个迭代的过程,layout过程当中,可能去改变constraints,有一次触发updating constraints,进行一轮layout过程。

注意:若是你每一次调用自定义layoutSubviews都会致使另外一个布局传递,那么你将会陷入一个无限循环中。 

以下图:

相关文章
相关标签/搜索