相对布局学习笔记

5.5, 1242*2208 414*736
4.7, 750*1334 375*667
4.0, 640*1136 320*568
3.5, 640*960 320*480

在哪里创建autolayout.
View中:直接在init方法里创建.
ViewController中:直接在viewDidLoad()里创建.
有人问,如果用IB创建约束,在viewDidLoad里不能获取到某个view的正确frame,怎么办?
这个时候你需要在一个叫viewDidLayoutSubviews()里的方法里获取一个view的正确frame.

layoutSubviews在以下情况下会被调用:
1、init初始化不会触发layoutSubviews。
2、addSubview会触发layoutSubviews。
3、设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化。
4、滚动一个UIScrollView会触发layoutSubviews。
5、旋转Screen会触发父UIView上的layoutSubviews事件。
6、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件。
7、直接调用setLayoutSubviews。

setNeedsLayout()方法: 标记为需要重新布局
异步调用layoutIfNeeded()刷新布局,不立即刷新,但layoutSubviews()一定会被调用
layoutIfNeeded()方法:如果,有需要刷新的标记,立即调用layoutSubviews()进行布局(如果没有标记,不会调用layoutSubviews())
如果要立即刷新,要先调用view.setNeedsLayout(),把标记设为需要布局,然后马上调用view.layoutIfNeeded(),实现布局

在视图第一次显示之前,标记总是“需要刷新”的,可以直接调用view.layoutIfNeeded()

public func setNeedsLayout()
public func layoutIfNeeded()

public func layoutSubviews()

总结:
在下面里面方法中获取view的正确frame,xib,stroyboard 用了autlayout的布局,或者用代码给view做了布局,但是其子view没有加布局, 可以在下面方法中设置子 view的Frame
uiview的layoutSubviews方法
viewcontroller的viewDidLayoutSubviews方法

在哪里创建autolayout.
View中:直接在init方法里创建.
ViewController中:直接在viewDidLoad()里创建.
有人问,如果用IB创建约束,在viewDidLoad里不能获取到某个view的正确frame,怎么办?
这个时候你需要在一个叫viewDidLayoutSubviews()里的方法里获取一个view的正确frame.

参考:http://reviewcode.cn/article.html?reviewId=14

你可能感兴趣的:(相对布局学习笔记)