horizontalSizeClass 返回 nil

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

我正在尝试让我的 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。

ios swift swiftui
3个回答
1
投票

规模班级的运作方式与方向不同。

例如,对于 iPhone 12 Pro,您有两种组合:

  • orientation: vertical
    ->
    verticalSizeClass: regular
    ,
    horizontalSizeClass: compact
  • orientation: horizontal
    ->
    verticalSizeClass: compact
    ,
    horizontalSizeClass: compact

这意味着对于大多数 iPhone 而言,无论方向如何,

@Environment(\.horizontalSizeClass) var sizeClass
始终为
compact

一般来说,您应该根据尺寸类别而不是设备方向来设计视图。

但是,如果您确实想根据方向更改视图,您可以订阅

UIDevice.orientationDidChangeNotification
,如下所述:


0
投票

它是接口声明中可选的(见下文),因此它是“设计使然” - 这意味着系统可能尚未检测到尺寸类别,稍后将进行更新。您应该根据适合您的应用程序的方式明确处理此类情况。

extension EnvironmentValues {

    /// The horizontal size class of this environment.
    @available(macOS, unavailable)
    @available(tvOS, unavailable)
    @available(watchOS, unavailable)
    public var horizontalSizeClass: UserInterfaceSizeClass?

0
投票

就我而言,当在

@Environment(\.horizontalSizeClass)
上声明并在
nil
内消耗时,
App
正在返回
WindowGroup
。将环境变量移动到根视图后,它会返回正确的值。

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