参考链接:https://sq.163yun.com/blog/article/200743376636538880
1、setNeedsDisplay或者setNeedsDisplay(rect: CGRect)
- 标记相应的视图区域需要重绘
- 调用之后不会立即重绘,而是在下一个绘制周期里绘制
- 调用View的 draw(_ rect: CGRect)方法
- 不会调用layoutSubviews()方法
2、setNeedsLayout
- 不会立即更新界面,会在下一个刷新周期里更新
- 需要在主线程调用此方法
- 不管尺寸有没有更改都会会调用layoutSubviews()方法
3、layoutIfNeeded
- 会立即更新视图
- 使用自动布局的视图会默认更新改变的尺寸
- 在动画里使用该属性
- 有需要刷新的标记会立即调用,没有则不会调用
4、layoutSubviews调用时机
- 初始化时设置frame不为Zero会触发
- 直接调用[self setNeedsLayout]
- addSubview时
- 当view的size发送改变的时候,前提是frame的值前后发生了变化
- 滑动UIScrollView的时候
- 旋转屏幕 可能会触发
- 更新视图的 constraint
总结:
- 如果要立即刷新,先调用[view setNeedsLayout],标记为需要布局,然后调用[view layoutIfNeeded],实现布局
网友评论