首页 > 解决方案 > 包括基于平台的 SwiftUI 视图修饰符

问题描述

我正在使用 SwiftUI 开发跨平台应用程序。我有一个视图,其中包含一个HStack排列着各种项目的视图。本质上,这是:

struct ContentView: View {
    var body: some View {
        HStack {
            // Some stuff on the left side of this HStack
            Spacer()
            // more stuff on the right side
        }
    }
}

占用尽可能多的Spacer空间,这会将它之前的视图推到左侧,并将它之后的视图推到行的右侧。我已经达到了在 iOS 上看起来很棒的地步。

不过在 macOS 上,我的窗口宽度要大得多,并且可以由用户进一步调整大小。在那些较大的宽度上,看到行内容被如此多的空间分隔开来会变得很尴尬。所以我想限制宽度。本质上,我想这样做:

struct ContentView: View {
    var body: some View {
        HStack {
            // a bunch of stuff in this stack
        }
        #if os(macOS)
        .frame(width: 120)
        #endif
    }
}

但这让我收到来自带有.frame修饰符的行的错误“意外的平台条件(预期的'os','arch'或'swift')”。如果我重新创建整个HStack平台内部检查,如下所示,一切正常。

struct ContentView: View {
    var body: some View {
        #if os(iOS)
        HStack {
            // a bunch of stuff in this stack
        }
        #elseif os(macOS)
        HStack {
            // a bunch of stuff in this stack
        }
        .frame(width: 120)
        #endif
    }
}

但是似乎很容易复制里面的所有东西HStack,只是为了能够根据平台改变修饰符。真的没有办法有条件地编译修饰符代码吗?

标签: iosswiftmacosswiftui

解决方案


只需将一堆东西分成独立视图,例如

struct ContentView: View {
    var body: some View {
        #if os(iOS)
          MainView()
        #elseif os(macOS)
          MainView()
             .frame(width: 120)
        #endif
    }
}

struct MainView: View {
    var body: some View {
        HStack {
            // a bunch of stuff in this stack
        }
    }
}

推荐阅读