Включение модификаторов представления 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
    }
}

Но это вызывает у меня ошибку Неожиданное состояние платформы (ожидаемое ‘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

См. также:  Xcode и Swift - невозможно создать экземпляр другого контроллера представления из AppDelegate
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. Cem Schemel

    Просто выделите кучу вещей в отдельном представлении, например

    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
            }
        }
    }
    
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: