IOS-layoutSubviews方法的调用时机
IOS-layoutSubviews方法的调用时机
- 前言
- layoutSubviews调用时机
- setNeedsLayout 和 layoutIfNeeded
- addSubview
- 改变view的size大小
- 需要注意点
前言
最近在开发项目的过程中,修改以前的布局代码,之前单独设置上、下、宽度、高度,的值是正常,但是我改成设置空间的frame
之后,程序运行发生了死循环, 最后找到子控件的layoutSubviews
方法中设置自身的高度,然后再父视图,我又设置了该控件的frame。
子控件的代码:
在运行之后,展示该控件时,发生了死循环, 自己对layoutSubviews
的调用时机,也不是很清楚,所以这里想学习记录下layoutSubviews
方法的调用时机
这里需要注意的是layoutSubviews
本身不会做任何工作,它只是提供了一个调用时机,需要自己重写
layoutSubviews调用时机
- 注意: 这里需要注意的是,我们创建控件,调用控件的
init
或则initWithFrame
方法都是不会触发控件的layoutSubviews方法的调用的
setNeedsLayout 和 layoutIfNeeded
- 调用view的
setNeedsLayout
方法时,这时候会触发该view的layoutSubviews
方法的调用,这里需要是一一对应的关系,那个view调用setNeedsLayout
方法就触发哪个view
的layoutSubviews
方法
对此官方文档有一段描述:
You should not call this method directly. If you want to force a layout update, call the
setNeedsLayout
method instead to do so prior to the next drawing update. If you want to update the layout of your views immediately, call thelayoutIfNeeded
method.
大概的意思如下:
您不应该直接调用此方法。如果你想强制一个布局更新,调用
setNeedsLayout
方法,而不是在下一次绘图更新之前这样做。如果您想立即更新视图的布局,请调用layoutIfNeeded
方法。
所以调用layoutIfNeeded
方法,也会触发layoutSubviews
方法的回调
addSubview
当触发addSubView时, view
和子view
的layoutSubviews
方法会调用, 并且是先调用View的layoutSubviews
方法在调用子view
的, 而且就算是添加多个子view,那么view的layoutSubviews
也只会调用一次, 而不是调用多次
上述情况指的是在同一个RunLoop
中,也就是同一个线程中, 那么如果在不同的RunLoop(不同线程)
中调用addSubview
方法了, 那么都会触发多次, 输出结果如下:
注意: 如果view的size是0,那么及时调用addSubview,也不会触发大小为0的view的layoutSubviews方法(注意这是size为0.就是宽度和高度都为0,如果只有其中为0,还是会调用layoutSubviews方法的
)
改变view的size大小
当我们改变view的大小的时候,会触发view的layoutSubviews
方法的调用, 但是如果没有触发size的改变,只是触发了位置的改变, 是不会触发layoutSubviews
的
修改位置
改变size
如果是改变子view
的size,那么子view
和父view
的layoutSubviews
方法都会调用
需要注意点
- 旋转屏幕只会调用
controller
的self.view
的layoutSubviews
- 关于在
父view
的layoutSubviews
里改变子view
的frame
不会循环调用的问题是因为一般情况下改变子view
的frame
的值都是固定的,而如果每次改变的值不同,也会重复调用父view
的layoutSubviews
IOS-layoutSubviews方法的调用时机相关推荐
- 关于Activity onNewIntent方法的调用时机
在官方API上的说明如下: http://developer.android.com/reference/android/app/Activity.html#onNewIntent(android.c ...
- Python面向对象程序设计中对象析构方法的调用时机
开学第一课:一定不要这样问老师Python问题 中国大学MOOC"Python程序设计基础"第6次开课时间 董付国老师Python系列教材推荐与选用参考 ============= ...
- SAP Spartacus UserService.get方法的调用时机
在cart-page-layout-handler.ts: selective-cart.service.ts: 上图48行this.userService.get()返回一个Observable: ...
- (0083)iOS开发之layoutSubviews 的调用时机
在写程序时候遇见layoutSubviews触发时候引起的问题. 思考 1:layoutSubviews 的调用时机? 2:layoutSubviews的用途? layoutSubviews在以下情况 ...
- UIView的layoutSubviews和drawRect方法何时调用
UIView的layoutSubviews和drawRect方法何时调用 转自:http://jianyu996.blog.163.com/blog/static/1121145552013051 ...
- js怎么调用ios的方法(原网址:https://www.jianshu.com/p/ce5e8c2f6d2e或者https://tech.youzan.com/jsbridge/)
网页(js)与oc(iOS)之间的方法调用及传值 清都 关注 2017.07.27 15:36* 字数 363 阅读 110评论 0喜欢 0 最后更新时间:2017-07-27 调用的对象bsg只是一 ...
- IOS之NSArray 中调用的方法详解(2)
20. - (NSArray *)sortedArrayUsingSelector:(SEL)comparator; 这是用来排序的函数,comparator 这个参数,需要传入一个返回结果是NS ...
- IOS之NSArray 中调用的方法详解
下面的例子以 NSArray *array = [NSArray arrayWithObjects:@"wendy",@"andy",@"t ...
- 25、UIView的setNeedsLayout, layoutIfNeeded 和 layoutSubviews 方法之间的关系解释
layoutSubviews总结 ios layout机制相关方法 - (CGSize)sizeThatFits:(CGSize)size - (void)sizeToFit ------- - (v ...
最新文章
- 跑了4个实验,实战讲解 MySQL的行锁、间隙锁...​
- java对docker_Java和Docker限制问题
- 数据告诉你史上最年轻35000分先生到底有多强?
- git 添加未跟踪的文件
- leetcode 无重复字符的最长子串
- TokenInsight:BTC新增流量稳定,但泡沫指数已超17年峰值
- [APEC中小企业峰会2009上]对话:经济适用男 vs 超级豪华男
- python编程例子-python编程例子
- 机器学习-数据科学库-day6
- 凸优化有关的数值线性代数知识 2求解已经因式分解的矩阵的线性方程组
- Webservice接口开发简单例子
- 南海区妇幼保健院HIS数据容灾备份系统项目
- 【深度优先搜索】复原IP地址
- Oracle 数据库生成2022年节假日表SQL
- 机器学习案例之_金融反欺诈预测
- 从平凡到不平凡(转)
- linux 命令 置顶,[置顶] Linux命令惯用法
- JAVA 日期加减计算
- 概率统计_协方差的传播 Covariance Propagation
- 量词辖域扩张和收缩律的8个等价式 根本理解