Action layoutSubview [view] and mechanism of action

Outline

There is a method in UIView layoutSubviews, this method is defined as follows Here Insert Picture Description

//覆盖点。由layoutifrequired自动调用。从iOS 6.0开始,
当使用基于约束的布局时,基本实现应用基于约束的布局,
否则它什么也不做。

Call mechanism

1、init初始化不会触发layoutSubviews
但是是用initWithFrame 进行初始化时,当rect的值不为CGRectZero时,也会触发
2、addSubview会触发layoutSubviews
3、设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化
在这里需要注意的是  「addSubview会触发layoutSubviews,但view的frame是0时不会掉用, 他会在viewDidLoad走完之后再触发, 所以addSubview之后如果在ViewDidLoad中改变大小是不会多次触发的 」
4、滚动一个UIScrollView会触发layoutSubviews
5、旋转Screen会触发父UIView上的layoutSubviews事件
6、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件

Note (in viewdidLoad in)

需要注意的是应该考虑导航栏的影响和一开始的view的大小,
如果下一开始<#CGFloat y>的值小于导航栏的高度20就会触发一次而	如果大于则不会,
然后就要看view的大小,如果不为零则触发一次,反之不触发,而如果一开始设置view的尺寸为零,
同时<#CGFloat y>则不会触发,但是如果在view的基础上添加子视图,
则会触发一次就算添加的子视图的frame设置为CGRectMake(0, 0, 0, 0)]也会触发。
总结一下最多触发两次。
其次 需要注意的是旋转的时候除法,就是如果旋转一次后导航栏的由有变无则触发一次,而从无到有也会触发一次,其它情况旋转则不会触发

effect

-layoutSubviews方法:这个方法,默认没有做任何事情
当我们自定义view的时候重写UIView的layoutSubviews
如果程序需要对该控件所包含的子控件布局进行更精确的控制
可通过重写该方法来实现。

Why in the Frame set LayoutSubview

因为在cell的复用中LayoutSubview方法可以多次使用,
而init方法不会重复调用所以Frame设置在 LayoutSubview里。

LayoutSubview Test Demo

Published 34 original articles · won praise 4 · Views 739

Guess you like

Origin blog.csdn.net/weixin_44824650/article/details/101548073