Я работаю над кроссплатформенным приложением с использованием 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
Источник: