Я работаю над кроссплатформенным приложением с использованием 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
}
}
Но это вызывает у меня ошибку Неожиданное состояние платформы (ожидаемое ‘os’, ‘arch’ или ‘swift’), исходящее из строки с модификатором .frame
. Если я воссоздаю весь 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
очень подвержена ошибкам, просто чтобы иметь возможность изменять модификатор в зависимости от платформы. Неужели нет возможности условно скомпилировать только код модификатора?
Эта ветка может быть полезна: stackoverflow.com/a/62099616/14733292 — person Cem Schemel schedule 31.12.2020
Просто выделите кучу вещей в отдельном представлении, например