OC & Swift 布局子控件

作者: coderYJ | 来源:发表于2016-03-14 23:52 被阅读523次
      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

    相关文章

      网友评论

      本文标题:OC & Swift 布局子控件

      本文链接:https://www.haomeiwen.com/subject/wxnflttx.html