我应该使用 viewDidLayoutSubviews() 还是 traitCollectionDidChange() 来响应界面方向的变化

问题描述 投票:0回答:3

当用户旋转他们的设备时,我正在尝试更新约束并更改我的子视图的布局。

据我了解,

viewDidLayoutSubviews()
traitCollectionDidChange()
都能够响应界面方向的变化(例如,当设备旋转时)。

根据Apple的文档,对于

viewDidLayoutSubviews()

当视图控制器视图的边界发生变化时,视图会调整其子视图的位置,然后系统调用此方法。

这里我假设当设备旋转时,视图的框架会更新,边界也会同时更新。

至于

traitCollectionDidChange()
,我了解到
traitCollection
UIViewController
属性包含了属于当前iOS环境的所有特征的信息,其中不仅包括水平和垂直大小类的特征,还包括用户等特征界面样式,负责设置深色和浅色模式。

因此我的问题是,我应该使用哪种方法来响应界面方向的变化?使用一种方法优于另一种方法/哪种方法在架构上更合理吗?

ios swift uiview uikit uitraitcollection
3个回答
2
投票

这取决于你想用这些信息做什么。

在我看来,除非不可能,否则最好使用

traitCollectionDidChange
而不是
viewDidLayoutSubviews

平均而言,

traitCollectionDidChange
在视图的生命周期中被调用的次数较少。因此,如果您不需要布局的常量值,使用
viewDidLayoutSubviews
只会为您的应用程序增加更多计算量。

为了更清楚:

如果您想根据方向更新约束或隐藏/显示视图,

traitCollectionDidChange
就足够了。

如果您想知道旋转后视图的大小是多少

viewDidLayoutSubviews
将是您想要使用的方法。


更新

也请看看这个答案


1
投票

选项 C:

viewWillTransition(to:with:)
可能是更新约束的更好选择。您可以根据新尺寸做出决定,并且可以使用
UIViewControllerTransitionCoordinator
参数为更改设置动画。作为旋转动画的一部分,这将使布局的变化更加流畅。

请记住,您不应该专注于方向。您应该只关注视图控制器的视图大小。所有决定都基于该尺寸,而不是方向。通过只关注大小,您的视图可以更好地适应不同的设备,并且它可以更好地适应 iPad 上的多任务处理,应用程序可能从全屏到 2/3 屏幕到 1/2 屏幕,再到 1/3 屏幕,同时设备方向保持不变。


-1
投票

当用户旋转他们的设备时,您可以同时使用 traitCollectionDidChange(_:)viewWillTransition(to:with:) 更新约束的方法,基于你想用这些信息做什么。

© www.soinside.com 2019 - 2024. All rights reserved.