哪些操作会间接使布局失效,无需调用setNeedsLayout()?
自动布局中无需手动调用
setNeedsLayout()的自动触发操作 你已经发现修改约束常量会自动触发布局更新,其实UIKit在很多操作里已经帮我们自动标记了布局失效,无需手动调用setNeedsLayout(),这类操作主要分为以下几类:
约束直接相关操作
- 修改约束的
constant或priority属性:不管是宽度、高度、间距还是位置约束,只要改动这两个属性,系统会自动标记布局需要更新 - 添加/移除约束:给视图新增约束,或者删除已有约束,系统会立刻感知到布局条件变化,安排后续布局更新
- 激活/停用约束:切换约束的
isActive属性(比如从false改成true),同样会自动触发布局重新计算
视图自身属性或状态变化
- 修改视图的固有内容尺寸(
intrinsicContentSize):比如UILabel修改文本后,固有宽高会变化,系统会自动触发布局;自定义视图重写该属性后,内部内容变化导致固有尺寸改变时也会触发 - 切换视图的
hidden属性:视图显示或隐藏状态改变时,尤其是当其他视图的约束依赖于该视图的状态时,系统会重新计算布局 - 修改
contentMode、clipsToBounds这类影响内容显示范围的属性:这类改动会影响视图的布局表现,UIKit会自动标记布局失效
视图层级或父视图相关操作
- 添加/移除子视图:视图层级发生变化时,父视图的布局会被自动标记为需要更新
- 修改
translatesAutoresizingMaskIntoConstraints属性:切换这个属性的开关(比如从自动转换约束改成手动添加约束),系统会自动处理布局的重新计算
本质上,这些操作的属性setter方法内部,UIKit已经帮我们调用了setNeedsLayout()或者相关的布局标记逻辑,所以不需要开发者重复执行。
内容的提问来源于stack exchange,提问作者Philip Gurin
相关产品推荐
相关产品推荐

