- 布局子控件
- layoutSubviews方法:这个方法如果子类从写了就
必须调用父类,如果不调用父类会出现未知的错误,例如:按钮不能点击,子控件的位置不对等等
,在这个方法里面布局子控件 - setNeedsLayout方法:标记为需要重新布局,异步调用layoutIfNeeded刷新布局,不立即刷新,但layoutSubviews一定会被调用
- layoutIfNeeded方法:
官方文档
When this message is received, the layer’s super layers are traversed until a ancestor layer is found that does not require layout.
Then layout is performed on the entire layer-tree beneath that ancestor.
当收到消息的时候他会直接遍历父类的layer,直到发现不需要布局的父类的layer,然后布局这个父类下面的所有子类的控件位置 - 2.重绘drawRect
drawRect:(CGRect)rect方法:重写这个方法,在这里绘图setNeedsDisplay方法:标记为需要重绘,异步调用drawRect
setNeedsDisplayInRect:(CGRect)rect,标记为需要在哪个范围重绘
-3.sizeToFit
sizeToFit会自动调用sizeThatFits方法;
sizeToFit不应该在子类中被重写,应该重写sizeThatFits
sizeThatFits传入的参数是当前的size,返回一个适合的size
sizeToFit可以被手动直接调用
sizeToFit和sizeThatFits方法都没有递归,对subviews也不负责,只负责自己
- 4.layoutSubviews
layoutSubviews对subviews重新布局
layoutSubviews方法调用先于drawRect
setNeedsLayout标上一个需要被重新布局的标记,一般在屏幕被刷新的时候布局
layoutIfNeeded方法如其名(在需要的时候调用layoutSubviews),UIKit会判断该receiver是否需要layout.根据Apple官方文档
layoutIfNeeded遍历的不是superview链,应该是subviews链
- 5 setNeedDisplay
官方文档
Calling this method causes the layer to recache its content. This results in the layer potentially calling either the displayLayer: or drawLayer:inContext: method of its delegate. The existing content in the layer’s contents property is removed to make way for the new content.
如果调用这个方法,会导致底层调用displayLayer:或drawLayer:
层中的现有的内容将被移除,添加新的内容
告诉系统我的view需要重新绘图,但是这个只是一个标记,系统一般在屏幕刷新的时候调用,draw方法重绘
提示
setNeedDisplay后系统是需要等到合适时机到达才会进行drawRect,
假如在setNeedDisplay后在主线程进行了大量运算,
那么drawRect会被一直找不到时机,直到这些运算完成。
理想的刷新率的1/60秒,
但如果因为某些原因让drawRect延迟了,那么画面就会卡。
你这直接在主线程sleep,所以drawRect也压后了。
iPhone 的刷新频率是60hz,也就是每1/60秒刷新一次,如果调用setNeedsLayout
,系统将在下一次刷屏幕刷新的时候调用layoutSubviews
网友评论