Skip to content

11.5_viewWillLayoutSubviews与viewDidLayoutSubviews方法的使用

理解 viewWillLayoutSubviews

viewWillLayoutSubviews 是一个在视图的子视图即将被布局时调用的方法。你可以把它看作是视图布局过程中的一个“预备”阶段。在这个方法中,你可以进行一些准备工作,例如调整子视图的属性,或者进行一些计算,以便在布局过程中使用。这个方法在视图的 bounds 发生改变时也会被调用,例如,当设备旋转时。

  • 何时调用? 在视图的子视图即将被布局之前。
  • 用途? 准备子视图的布局,例如调整属性或进行计算。
  • 场景? 设备旋转,视图 bounds 改变。

深入 viewDidLayoutSubviews

viewDidLayoutSubviews 是在视图的子视图完成布局后调用的方法。你可以把它看作是布局过程的“完成”阶段。在这个方法中,你可以进行一些收尾工作,例如更新 UI,或者进行一些基于布局结果的调整。这个方法同样在视图的 bounds 发生改变时也会被调用。

  • 何时调用? 在视图的子视图完成布局之后。
  • 用途? 进行基于布局结果的调整,更新 UI。
  • 场景? 设备旋转,视图 bounds 改变。

布局过程中的角色

这两个方法在视图的布局过程中扮演着不同的角色。viewWillLayoutSubviews 让你有机会在布局之前进行准备,而 viewDidLayoutSubviews 让你有机会在布局之后进行调整。你可以把它们想象成一个“先准备,后完成”的过程。

  1. 准备阶段: viewWillLayoutSubviews
  2. 布局阶段: 系统自动布局子视图。
  3. 完成阶段: 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 方法,以便让父类也能执行相应的操作。
  • 理解这两个方法的调用时机,以便在正确的时间进行布局调整。

希望这些解释能够帮助你更好地理解 viewWillLayoutSubviewsviewDidLayoutSubviews 这两个方法!🎉 记住,实践是最好的老师,多尝试,多练习,你一定能掌握它们!💪

本站使用 VitePress 制作