ios horizontalSizeClass返回nil

ff29svar  于 2024-01-09  发布在  iOS
关注(0)|答案(3)|浏览(130)

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

yptwkmov

yptwkmov1#

大小类的工作不同于方向。
例如,对于iPhone 12 Pro,您有两种组合:

  • orientation: vertical-> verticalSizeClass: regularhorizontalSizeClass: compact
  • orientation: horizontal-> verticalSizeClass: compacthorizontalSizeClass: compact

这意味着对于大多数iPhone来说,无论方向如何,@Environment(\.horizontalSizeClass) var sizeClass都将始终是compact
一般来说,您应该根据大小类而不是设备方向来设计视图。
但是,如果您真的想根据方向更改视图,您可以订阅UIDevice.orientationDidChangeNotification,如下所述:

yizd12fk

yizd12fk2#

它是可选的接口声明(见下文),所以它是“通过设计”-这意味着系统可能还没有检测到大小类,它将在以后更新。您应该显式处理这种情况,以适合您的应用程序。

extension EnvironmentValues {

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

字符串

s8vozzvw

s8vozzvw3#

在我的例子中,当在App上声明并在WindowGroup中使用时,@Environment(\.horizontalSizeClass)返回nil。将环境变量移动到根视图后,它返回正确的值。

相关问题