11.5_viewWillLayoutSubviews与viewDidLayoutSubviews方法的使用
理解 viewWillLayoutSubviews
viewWillLayoutSubviews 是一个在视图的子视图即将被布局时调用的方法。你可以把它看作是视图布局过程中的一个“预备”阶段。在这个方法中,你可以进行一些准备工作,例如调整子视图的属性,或者进行一些计算,以便在布局过程中使用。这个方法在视图的 bounds 发生改变时也会被调用,例如,当设备旋转时。
- 何时调用? 在视图的子视图即将被布局之前。
- 用途? 准备子视图的布局,例如调整属性或进行计算。
- 场景? 设备旋转,视图 bounds 改变。
深入 viewDidLayoutSubviews
viewDidLayoutSubviews 是在视图的子视图完成布局后调用的方法。你可以把它看作是布局过程的“完成”阶段。在这个方法中,你可以进行一些收尾工作,例如更新 UI,或者进行一些基于布局结果的调整。这个方法同样在视图的 bounds 发生改变时也会被调用。
- 何时调用? 在视图的子视图完成布局之后。
- 用途? 进行基于布局结果的调整,更新 UI。
- 场景? 设备旋转,视图 bounds 改变。
布局过程中的角色
这两个方法在视图的布局过程中扮演着不同的角色。viewWillLayoutSubviews 让你有机会在布局之前进行准备,而 viewDidLayoutSubviews 让你有机会在布局之后进行调整。你可以把它们想象成一个“先准备,后完成”的过程。
- 准备阶段:
viewWillLayoutSubviews - 布局阶段: 系统自动布局子视图。
- 完成阶段:
viewDidLayoutSubviews
使用示例
假设你有一个自定义的视图,其中包含一个标签和一个按钮。你希望在设备旋转时,标签和按钮的位置能够自动调整。你可以在 viewWillLayoutSubviews 中计算新的位置,然后在 viewDidLayoutSubviews 中更新标签和按钮的 frame。
swift
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
// 计算新的位置
let newLabelFrame = CGRect(x: 10, y: 10, width: 100, height: 30)
let newButtonFrame = CGRect(x: 120, y: 10, width: 80, height: 30)
// 保存新的位置,以便在 viewDidLayoutSubviews 中使用
labelFrame = newLabelFrame
buttonFrame = newButtonFrame
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
// 更新标签和按钮的 frame
label.frame = labelFrame
button.frame = buttonFrame
}注意事项
- 不要在这两个方法中进行耗时的操作,因为这会影响 UI 的性能。
- 确保调用
super方法,以便让父类也能执行相应的操作。 - 理解这两个方法的调用时机,以便在正确的时间进行布局调整。
希望这些解释能够帮助你更好地理解 viewWillLayoutSubviews 和 viewDidLayoutSubviews 这两个方法!🎉 记住,实践是最好的老师,多尝试,多练习,你一定能掌握它们!💪