- (void)creatAutoLayoutUSE
{
// 一、使用AutoLayout布局:自定义- (void)updateConstraints{}
// 二、不使用AutoLayout/AutoResizing布局:自定义- (void)layoutSubviews{}
// 三、总结:(推荐直接查看)
}
测量阶段:其从下向上(from subview to super view),为下一步layout准备信息。可以通过调用方法setNeedUpdateConstraints去触发此步。constraints的改变也会自动的触发此步。但是,当你自定义view的时候,如果一些改变可能会影响到布局的时候,通常需要自己去通知Auto layout,updateConstraintsIfNeeded。
自定义view的话,通常可以重写updateConstraints方法,在其中可以添加view需要的局部的contraints。
渲染/展示阶段:此步时把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都会导致另一个布局传递,那么你将会陷入一个无限循环中
* 当用自动布局时,系统自动调用。需要手动重写: - (void)updateContraints {}把添加约束的方法、代码写在这里面。注意调用[super updateContraints];
* setNeedUpdateConstrainsts:标记更改约束了,系统将来自动触发。
* updateConstraintsIfNeeded:告诉系统,在需要时候,更新约束。不是要求系统立即更新当前更改细节。
* 若更改约束后,要求系统立即调用-(void)updateConstraints,立即更新约束:需要同时,调用上面两个方法,且顺序不可变。
* 当不使用Autoresizing、AutoLayout时,直接使用frame设置位置时,这时,上述方法不需要重写,而是通过重写- (void)layoutSubviews{}来布局子空间的位置。
* setNeedslayout:标记更改了frame,系统将来某个时段自动触发。
* layoutIfNeeded:告诉系统,在需要时,更新frame。不是要求系统立即更新当前更改细节。
* 若更改frame后,要求系统立即调用- (void)layoutSubviews{}重新设置空间frame:这时,需要 同时调用上面两个方法,且顺序不变。
* (注意:与有无自动布局无关,只是单纯的将控件渲染/展示在屏幕上)当 只需要自身定制一款view时,需要重写
* -(void)drawRect:(CGRect)rect{} 设置view里有什么。例如 手势解锁view、画板view。(注:许多情况与手势、触摸事件紧密连接使用)
* -(CGSize)sizeThatFits:(CGSize)size{} 设置view子空间位置。
* sizeToFit不能重写
* setNeedsDisplay方法:标记为需要重绘,异步调用drawRect
* setNeedsDisplayInRect:(CGRect)invalidRect方法:标记为需要局部重绘
* sizeToFit:调用。
如果喜欢就点赞一下吧!如有不足之处,欢迎各位大神给出建议、意见!!感谢大家的支持!!您们的支持是我继续学习的动力。。。