我正在尝试让我的 swiftUI 视图动态调整大小。 我发现执行此操作的方法是使用如下所示的环境信息:
@Environment(\.horizontalSizeClass) var sizeClass
但是,它似乎没有返回任何东西。 使用调试器时,我看到该变量设置为“nil”。 我究竟做错了什么?例如,我需要在 info.plist 中启用某个选项或某些内容吗?
我的代码非常基本:
struct ContentView: View {
@Environment(\.horizontalSizeClass) var sizeClass
var body: some View {
if self.sizeClass == .compact {
Home_Vertical()
}
else {
Home_Horizontal()
}
}
}
我正在为 iPhone 进行开发,并允许所有设备方向。 iOS部署目标是iOS 14.0,xCode的版本是12.3。
规模班级的运作方式与方向不同。
例如,对于 iPhone 12 Pro,您有两种组合:
orientation: vertical
-> verticalSizeClass: regular
, horizontalSizeClass: compact
orientation: horizontal
-> verticalSizeClass: compact
, horizontalSizeClass: compact
这意味着对于大多数 iPhone 而言,无论方向如何,
@Environment(\.horizontalSizeClass) var sizeClass
始终为 compact
。
一般来说,您应该根据尺寸类别而不是设备方向来设计视图。
但是,如果您确实想根据方向更改视图,您可以订阅
UIDevice.orientationDidChangeNotification
,如下所述:
它是接口声明中可选的(见下文),因此它是“设计使然” - 这意味着系统可能尚未检测到尺寸类别,稍后将进行更新。您应该根据适合您的应用程序的方式明确处理此类情况。
extension EnvironmentValues {
/// The horizontal size class of this environment.
@available(macOS, unavailable)
@available(tvOS, unavailable)
@available(watchOS, unavailable)
public var horizontalSizeClass: UserInterfaceSizeClass?
就我而言,当在
@Environment(\.horizontalSizeClass)
上声明并在nil
内消耗时,App
正在返回WindowGroup
。将环境变量移动到根视图后,它会返回正确的值。