setNeedsDisplay 和 setNeedsLayout 以及 layoutIfNeeded的爱恨情仇

  1. setNeedsDisplay 和 setNeedsLayout 
              两个方法都是异步执行,setNeedsDisplay会自动调用drawRect方法,从而会从中得到当前上下文UIGraphicsGetCurrentContext进行绘图。而setNeedsLayout会默认调用layoutSubViews方法,进而处理子视图中的一些数据。综上所述,setNeedsDisplay方便绘图,setNeedsLayout方便处理数据。
  2. setNeedsLayout 和 layoutIfNeeded
    调用过setNeedsLayout方法后并不会立刻去执行layoutSubViews方法,而是等drawing cycle循环到达该节点时才会调用layoutSubViews方法进行布局。而如果对象布局设置发生改变后调用layoutIfNeeded方法会立刻重新布局即layoutSubviews方法会立刻被触发。
  3. layoutSubviews方法被调用的情况:
    a.直接调用setNeedsLayout方法时(注:已增加到父视图上).
    b.被增加到父视图上时addSubview(注:size不能为0) .
    c.给当前视图增加addSubview子视图时无论子视图的size是否为0,layoutSubviews都会被调用
    d.view的size发生改变的时候.
    e.滑动UIScrollView时.
    f.旋转Screen时会触发父控件上的layoutSubviews事件.
  4. drawRect方法被调用的情况:
    a.直接调用setNeedsDisplay或者setNeedsDisplayInRect:方法时.
    b.初始化时设置了视图大小时.
    c.调用过sizeToFit方法后.
    d.通过设置contentMode属性值为UIViewContentModeRedraw。那么将在每次设置或更改frame的时.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值