contraints,frame → layout→draw

  • (CGSize)sizeThatFits:(CGSize)size
  • (void)sizeToFit
    ——————–——————–
  • (void)layoutSubviews
  • (void)layoutIfNeeded
  • (void)setNeedsLayout
    ——————–——————–
  • (void)setNeedsDisplay
  • (void)drawRect
1️⃣layoutSubviews在以下情况下会被调用:
1、init初始化不会触发layoutSubviews

(但是是用initWithFrame初始化时,当rect的值不为CGRectZero时,会触发)

2、addSubview会触发layoutSubviews

3、设置子view的frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化

4、滚动一个UIScrollView会触发layoutSubviews

5、旋转Screen会触发父UIView上的layoutSubviews事件

6、改变一个子View大小的时候也会触发父UIView上的layoutSubviews事件
2️⃣布局

重写layoutSubviews方法,主要用在自定义UI控件类里.
(像UIButton类里肯定重写了此方法)

  • setNeedsLayout方法: 标记为需要重新布局,异步调用layoutIfNeeded刷新布局,不立即刷新,但layoutSubviews一定会被调用

  • layoutIfNeeded方法:如果,有需要刷新的标记,立即调用layoutSubviews进行布局(如果没有标记,不会调用layoutSubviews)

注:

  • 如果要立即刷新,要先调用[view setNeedsLayout],把标记设为需要布局,然后马上调用[view layoutIfNeeded],实现布局
  • 在视图第一次显示之前,标记总是“需要刷新”的,可以直接调用[view layoutIfNeeded]
// 经常连起来用来做立即布局
[view setNeedsLayout];
[view layoutIfNeeded];
3️⃣重绘
  • drawRect:(CGRect)rect方法:重写此方法,执行重绘任务

  • setNeedsDisplay方法:标记为需要重绘,异步调用drawRect

  • setNeedsDisplayInRect:(CGRect)invalidRect方法:标记为需要局部重绘

sizeToFit会自动调用sizeThatFits方法;
sizeToFit不应该在子类中被重写,应该重写sizeThatFits
sizeToFit可以被手动直接调用
sizeToFit和sizeThatFits方法都没有递归,对subviews也不负责,只负责自己

=======================================

initWithNibName:bundle: (加载带有XIB的控制器)
loadView (控制器的View为空的时候调用,帮控制器加载View)
initWithCoder: (是当从nib文件中加载对象的时候会调用)
awakeFromNib (当.nib文件被加载的时候,会发送一个awakeFromNib的消息到.nib文件中的每个对象)
initWithFrame: (代码创建View时调用,是懒加载,只有到需要显示时,子控件才不是 nil)
init(代码使用创建控件alloc init 时,系统底层调用init方法)

你可能感兴趣的:(contraints,frame → layout→draw)