问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

ios中drawrect和layoutsubviews的区别

发布网友 发布时间:2022-05-18 09:44

我来回答

1个回答

热心网友 时间:2023-10-13 22:30

  关于这两个方法的区别 还是有点意思的。
  
  UIView的setNeedsDisplay和setNeedsLayout方法。首先两个方法都是异步执行的。setNeedsDisplay会调用自动调用drawRect方法,这样可以拿到UIGraphicsGetCurrentContext,就可以画画了。而setNeedsLayout会默认调用layoutSubViews,就可以处理子视图中的一些数据。
  综上两个方法都是异步执行的,layoutSubviews方便数据计算,drawRect方便视图重绘。
  
  先大概看下ios layout机制相关的这几个方法:
  - (CGSize)sizeThatFits:(CGSize)size
  - (void)sizeToFit
  ——————-
  - (void)layoutSubviews
  - (void)layoutIfNeeded
  - (void)setNeedsLayout
  ——————–
  - (void)setNeedsDisplay
  - (void)drawRect
  
  一、
  layoutSubviews在以下情况下会被调用:
  1、init初始化不会触发layoutSubviews。
  2、addSubview会触发layoutSubviews。
  3、设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化。
  4、滚动一个UIScrollView会触发layoutSubviews。
  5、旋转Screen会触发父UIView上的layoutSubviews事件。
  6、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件。
  7、直接调用setLayoutSubviews。
  8、直接调用setNeedsLayout。
  在苹果的官方文档中强调:You should override this method only if the autoresizing behaviors of the subviews do not offer the behavior you want.
  layoutSubviews, 当我们在某个类的内部调整子视图位置时,需要调用。
  反过来的意思就是说:如果你想要在外部设置subviews的位置,就不要重写。
  
  刷新子对象布局
  -layoutSubviews方法:这个方法,默认没有做任何事情,需要子类进行重写
  -setNeedsLayout方法: 标记为需要重新布局,异步调用layoutIfNeeded刷新布局,不立即刷新,但layoutSubviews一定会被调用
  -layoutIfNeeded方法:如果,有需要刷新的标记,立即调用layoutSubviews进行布局(如果没有标记,不会调用layoutSubviews)
  如果要立即刷新,要先调用[view setNeedsLayout],把标记设为需要布局,然后马上调用[view layoutIfNeeded],实现布局
  在视图第一次显示之前,标记总是“需要刷新”的,可以直接调用[view layoutIfNeeded]
  
  二、
  drawRect在以下情况下会被调用:
  1、如果在UIView初始化时没有设置rect大小,将直接导致drawRect不被自动调用。drawRect 掉用是在Controller->loadView, Controller->viewDidLoad 两方法之后掉用的.所以不用担心在 控制器中,这些View的drawRect就开始画了.这样可以在控制器中设置一些值给View(如果这些View draw的时候需要用到某些变量 值).
  2、该方法在调用sizeToFit后被调用,所以可以先调用sizeToFit计算出size。然后系统自动调用drawRect:方法。
  sizeToFit会自动调用sizeThatFits方法;
  sizeToFit不应该在子类中被重写,应该重写sizeThatFits
  sizeThatFits传入的参数是receiver当前的size,返回一个适合的size
  sizeToFit可以被手动直接调用
  sizeToFit和sizeThatFits方法都没有递归,对subviews也不负责,只负责自己
  3、通过设置contentMode属性值为UIViewContentModeRedraw。那么将在每次设置或更改frame的时候自动调用drawRect:。
  4、直接调用setNeedsDisplay,或者setNeedsDisplayInRect:触发drawRect:,但是有个前提条件是rect不能为0。
  -setNeedsDisplay方法:标记为需要重绘,异步调用drawRect
  -setNeedsDisplayInRect:(CGRect)invalidRect方法:标记为需要局部重绘
  以上1,2推荐;而3,4不提倡
  
  drawRect方法使用注意点:
  1、 若使用UIView绘图,只能在drawRect:方法中获取相应的contextRef并绘图。如果在其他方法中获取将获取到一个invalidate 的ref并且不能用于画图。drawRect:方法不能手动显示调用,必须通过调用setNeedsDisplay 或 者 setNeedsDisplayInRect,让系统自动调该方法。
  2、若使用calayer绘图,只能在drawInContext: 中(类似鱼drawRect)绘制,或者在delegate中的相应方法绘制。同样也是调用setNeedDisplay等间接调用以上方法
  3、若要实时画图,不能使用gestureRecognizer,只能使用touchbegan等方法来掉用setNeedsDisplay实时刷新屏幕
  
  三、
  layoutSubviews对subviews重新布局
  layoutSubviews方法调用先于drawRect
  setNeedsLayout在receiver标上一个需要被重新布局的标记,在系统runloop的下一个周期自动调用layoutSubviews
  layoutIfNeeded方法如其名,UIKit会判断该receiver是否需要layout.根据Apple官方文档,layoutIfNeeded方法应该是这样的
  layoutIfNeeded遍历的不是superview链,应该是subviews链
  drawRect是对receiver的重绘,能获得context
  setNeedDisplay在receiver标上一个需要被重新绘图的标记,在下一个draw周期自动重绘,iphone device的刷新频率是60hz,也就是1/60秒后重绘
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
魔兽世界80牧师治疗天赋 魔兽世界80级牧师加血还强大么? 上海自驾游最全攻略,短途无比惊艳的自驾游 请问去新疆旅游,什么季节最合适? 不正创是什么意思? 知识产权侵权责任承担形式有哪些 完全产权是什么意思? 产权错位是什么意思? 抖音通知设置为什么没有全部? 巴黎欧莱雅男士劲能醒肤露如何通过创新成分提升皮肤防护和活力? 宝马E66有无蓝牙播歌 宝马5系2013款蓝牙能放音频吗 有几种?什么是公众号?服务号?订阅?它们是如何注册?如何使用? 和公众号有什么区别吗 微信公众号号码是吗 微信公众号与码有什么不同? 有几种?什么是公众号?服务号?订阅?它们是如何注册?如何使用? 金话筒和俏嘴巴口才哪个好 微信账号和微信公众号账号是一个吗的最新相关信息 和微信公众号有啥区别? 与公众号是同一号吗 微信公众号跟普通有什么区别? 少儿主持人培训的老师哪个好? 微信公众号跟普通有什么区别? 和公众号有什么区别吗 微信公众号的名称和有什么区别 微信公众号和一样吗 微信公众号和有区别吗 就是公众号吗? 小米摄像头云台版在使用拔出插头的后果 ios drawrect什么时候调用 ios drawrect 在什么情况下会被调用 ios开发怎么用drawrect画表格 用过的礼花筒会炸吗 ios 画图必须在drawrect里执行吗 礼花筒放了一年还能用吗 既然婚礼用的彩纸礼花筒不能过安检那快递物流是怎么过的安检呢 UIView的layoutSubviews和drawRect方法何时调用 柠檬树下的爱 是什么意思啊? 什么时候需要重写layoutSubviews和drawRect方法 ios开发使用drawrect画柱形图有个黑色的边框 如何去掉 顺丰加急件怎么收费 顺丰的加急件的收费是怎样的呢? 一下子拉了很长的稀屎是怎么回事? 今天拉了好多屎,是不是对身体不好,没有腹泻 一人拉屎一拉就很多是怎么了 抖音上歌曲当你走了,歌词想表达的什么意思 小鸡一下子拉了好多屎,怎么回事?急急! 当你走了和当妮走了区别 请问谁有徐真真当你走了mp3的百度资源,谢谢