OC & Swift 布局子控件

    1. 布局子控件
  • 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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容