当用户旋转他们的设备时,我正在尝试更新约束并更改我的子视图的布局。
据我了解,
viewDidLayoutSubviews()
和 traitCollectionDidChange()
都能够响应界面方向的变化(例如,当设备旋转时)。
根据Apple的文档,对于
viewDidLayoutSubviews()
,
当视图控制器视图的边界发生变化时,视图会调整其子视图的位置,然后系统调用此方法。
这里我假设当设备旋转时,视图的框架会更新,边界也会同时更新。
至于
traitCollectionDidChange()
,我了解到traitCollection
的UIViewController
属性包含了属于当前iOS环境的所有特征的信息,其中不仅包括水平和垂直大小类的特征,还包括用户等特征界面样式,负责设置深色和浅色模式。
因此我的问题是,我应该使用哪种方法来响应界面方向的变化?使用一种方法优于另一种方法/哪种方法在架构上更合理吗?
这取决于你想用这些信息做什么。
在我看来,除非不可能,否则最好使用
traitCollectionDidChange
而不是viewDidLayoutSubviews
。
平均而言,
traitCollectionDidChange
在视图的生命周期中被调用的次数较少。因此,如果您不需要布局的常量值,使用 viewDidLayoutSubviews
只会为您的应用程序增加更多计算量。
为了更清楚:
如果您想根据方向更新约束或隐藏/显示视图,
traitCollectionDidChange
就足够了。
如果您想知道旋转后视图的大小是多少
viewDidLayoutSubviews
将是您想要使用的方法。
更新:
也请看看这个答案
viewWillTransition(to:with:)
可能是更新约束的更好选择。您可以根据新尺寸做出决定,并且可以使用 UIViewControllerTransitionCoordinator
参数为更改设置动画。作为旋转动画的一部分,这将使布局的变化更加流畅。
请记住,您不应该专注于方向。您应该只关注视图控制器的视图大小。所有决定都基于该尺寸,而不是方向。通过只关注大小,您的视图可以更好地适应不同的设备,并且它可以更好地适应 iPad 上的多任务处理,应用程序可能从全屏到 2/3 屏幕到 1/2 屏幕,再到 1/3 屏幕,同时设备方向保持不变。
当用户旋转他们的设备时,您可以同时使用 traitCollectionDidChange(_:) 和 viewWillTransition(to:with:) 更新约束的方法,基于你想用这些信息做什么。