ios - 包括基于平台的 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
,只是为了能够根据平台改变修饰符。真的没有办法有条件地编译修饰符代码吗?
解决方案
只需将一堆东西分成独立视图,例如
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
}
}
}
推荐阅读
- c++ - 在 C++ 中将 Gstreamer 与 Google 语音 API(流式转录)一起使用
- java - scala.ScalaReflectionException:JavaMirror 中的类 java.sql.Timestamp 与 ClasspathFilter
- vim - 多个命令与 . vim 中的(点)
- android - 约束布局在不同设备中的表现不同
- c# - 当使用无参数 View() 重新调用视图时,视图正在缓存其先前的数据 - 当我不希望它时
- google-dfp - Google Ad Manager - 同一订单项在屏幕上投放所有广告单元,即使它没有足够的广告素材
- android - 用于屏幕指纹的 Android API
- internationalization - i18next-browser-languageDetector 路径不起作用
- python - 使用 Pandas 动态创建数据框
- python - Cython 中的“仅限 C”类