一直对layoutSubviews不怎么明白,看到这篇文章转一下:

layoutSubviews总结

ios layout机制相关方法

- (CGSize)sizeThatFits:(CGSize)size
- (void)sizeToFit
——————-

- (void)layoutSubviews
- (void)layoutIfNeeded
- (void)setNeedsLayout
——————–

- (void)setNeedsDisplay
- (void)drawRect
layoutSubviews在以下情况下会被调用:

1、init初始化不会触发layoutSubviews

但是是用initWithFrame 进行初始化时,当rect的值不为CGRectZero时,也会触发

2、addSubview会触发layoutSubviews

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

4、滚动一个UIScrollView会触发layoutSubviews

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

6、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件

在苹果的官方文档中强调:

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:(CGRect)rect方法:重写此方法,执行重绘任务
-setNeedsDisplay方法:标记为需要重绘,异步调用drawRect
-setNeedsDisplayInRect:(CGRect)invalidRect方法:标记为需要局部重绘

sizeToFit会自动调用sizeThatFits方法;

sizeToFit不应该在子类中被重写,应该重写sizeThatFits

sizeThatFits传入的参数是receiver当前的size,返回一个适合的size

sizeToFit可以被手动直接调用

sizeToFit和sizeThatFits方法都没有递归,对subviews也不负责,只负责自己

———————————-

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秒后重绘

原文链接:http://www.cocoachina.com/bbs/read.php?tid=111832

转载于:https://www.cnblogs.com/mzds/p/3844121.html

(转)layoutSubviews总结相关推荐

  1. layoutSubviews总结(转)

    - (void)setNeedsDisplay - (void)drawRect 但是是用initWithFrame 进行初始化时,当rect的值不为CGRectZero时,也会触发 You shou ...

  2. layoutSubviews 调用情况

    init初始化不会触发layoutSubviews 但是是用initWithFrame 进行初始化时,当rect的值不为CGRectZero时,也会触发 addSubview会触发layoutSubv ...

  3. 谈谈UIView的几个layout方法-layoutSubviews、layoutIfNeeded、

    2019独角兽企业重金招聘Python工程师标准>>> 从百度上搜索了一下layoutSubviews的用处,以下是搜索的结果,当然,笔者是会一一验证的. 1. init初始化不会触 ...

  4. (0083)iOS开发之layoutSubviews 的调用时机

    在写程序时候遇见layoutSubviews触发时候引起的问题. 思考 1:layoutSubviews 的调用时机? 2:layoutSubviews的用途? layoutSubviews在以下情况 ...

  5. layoutSubviews何时被调用

    layoutSubviews在以下情况下会被调用: 1.init初始化不会触发layoutSubviews 但是是用initWithFrame 进行初始化时,当rect的值不为CGRectZero时, ...

  6. UIView的layoutSubviews和drawRect方法何时调用

    UIView的layoutSubviews和drawRect方法何时调用   转自:http://jianyu996.blog.163.com/blog/static/1121145552013051 ...

  7. 25、UIView的setNeedsLayout, layoutIfNeeded 和 layoutSubviews 方法之间的关系解释

    layoutSubviews总结 ios layout机制相关方法 - (CGSize)sizeThatFits:(CGSize)size - (void)sizeToFit ------- - (v ...

  8. layoutSubviews什么时候触发调用

    ayoutSubviews在以下情况下会被调用: 1.init初始化不会触发layoutSubviews 2.addSubview会触发layoutSubviews 3.设置view的Frame会触发 ...

  9. layoutSubviews 详解

    ios layout机制相关方法 - (CGSize)sizeThatFits:(CGSize)size - (void)sizeToFit ------- - (void)layoutSubview ...

最新文章

  1. 雅虎公司C#笔试题,看看你能解答多少? [含答案]
  2. 中国人炫富的第N种表现。
  3. Oracle入门(十四.16)之捕获用户定义的异常
  4. 《爬虫写得好,铁窗关到老》教你把握爬虫的法律边界!㊫
  5. 6位密码锁的c语言编程,51单片机4*3矩阵键盘6位密码锁c语言程序
  6. 【Qt串口调试助手】1.0 - 400行代码撸一个Qt5串口调试助手框架
  7. 学C语言开发能实现月薪12K吗?
  8. Oracle 10g升级之--PSU 升级(续)
  9. 第四章 Python数据预处理之划分训练集与测试集
  10. 软件Faststone Capture 注册码
  11. md设备linux,【linux基础】14、raid和md模块
  12. 多元相关与回归分析及R使用
  13. 企业微信怎么统计客户数量
  14. CAD命令行不见了怎么重新恢复?
  15. Java 如何将线程挂起呢?
  16. 玩游戏用什么轴的机械键盘好_机械键盘吃鸡用什么轴好?玩绝地求生机械键盘键轴推荐...
  17. subscription-manager repos --enable <repo>
  18. 带你了解热门IoT开源项目:home assistant
  19. 肯德基门店 csv
  20. 项目管理sod_SOD健康给世界快乐体育公益项目在京启动

热门文章

  1. 苹果2010新品发布会图文实录
  2. 给小白图示讲解OFDM的原理
  3. AIX 操作系统中AIO、DIO、CIO 的相关概念介绍 (二)
  4. pytorch和jittor 程序对比
  5. 从源码分析DEARGUI之add_tooltip
  6. vlayout 1.2.20 发布,阿里 LayoutManager 定制化布局
  7. 修复Eclipse在Mac OSX下启动时卡住问题
  8. Python学习札记(二十三) 函数式编程4 sorted
  9. 完毕port(CompletionPort)具体解释 - 手把手教你玩转网络编程系列之三
  10. SJCL:斯坦福大学JS加密库