SwiftUI изменить размер текста для MacOS - PullRequest
1 голос
/ 18 апреля 2020

Использование SwiftUI для небольшого all, и я заметил, что размер шрифта очень маленький в macOS

var body: some View {
        VStack {
            NavigationView {
                List(fetch.Novitadss) { Novitads in
                    VStack(alignment: .leading) {
                        // 3.
                        Text(Novitads.title)
                            .font(.headline)
                            .fontWeight(.regular)
                            .onTapGesture {
                                UIApplication.shared.open(URL(string: Novitads.link)!)
                            }
                    }
                }

Я хотел бы добавить условие для изменения .font (.headline), если os - macOS поэтому я попытался

                         #if os(iOS)
                            .font(.headline)
                        #elseif os(macOS)
                               .font(.title)
                        #endif

, но я получил «Неожиданное состояние платформы (ожидаемое« os »,« arch »или« swift »)»

Ответы [ 3 ]

1 голос
/ 19 апреля 2020

Из вашего комментария , вы спросили, почему ваш код не работал, что я объясню в моем ответе.

Согласно документации , условная компиляция Блок имеет следующий синтаксис:

enter image description here

Обратите внимание, что он говорит «операторы» внутри блока. .font(.headline) не является заявлением, поэтому незаконно помещать его туда. Это также очевидно в формальной грамматической нотации далее по странице:

enter image description here

Кроме того, в блоке «Примечание» чуть выше формальной грамматики:

Каждый оператор в теле блока условной компиляции анализируется, даже если он не скомпилирован. Однако есть исключение, если условие компиляции включает в себя swift() условие платформы.

Это объясняет, почему в вашем блоке #elseif также есть ошибка.

Другими словами, #if операторы являются , а не вашими директивами препроцессора C ++:)

Поэтому, чтобы решить проблему, вы должны поместить весь оператор в этих блоках. Один (тупой) способ исправить это:

 #if os(iOS)
Text(Novitads.title)
    .font(.headline)
    .fontWeight(.regular)
    .onTapGesture {
        UIApplication.shared.open(URL(string: Novitads.link)!)
    }
#elseif os(macOS)
Text(Novitads.title)
    .font(.title)
    .fontWeight(.regular)
    .onTapGesture {
        // UIApplication.shared.open(URL(string: Novitads.link)!)
        // you would use this on macOS to open URLs, right?
        NSWorkspace.shared.open(URL(string: Novitads.link)!)
    }
#endif

Конечно, решение Asperi по извлечению platformFont метода - это лот лучше.

1 голос
/ 19 апреля 2020

Пожалуйста, отметьте эту статью Это должно быть так:

#if targetEnvironment(macCatalyst)
return self.font(.largeTitle)
#elseif os(iOS)
return self.font(.system(size: 10))
#else
return self
#endif
1 голос
/ 18 апреля 2020

Вы можете использовать следующее вспомогательное расширение

extension Text {
    func platformFont() -> Text {
#if canImport(AppKit) || targetEnvironment(macCatalyst)
        return self.font(.title)
#elseif canImport(UIKit)
         return self.font(.headline)
#else
        return self
#endif
    }
}

и использование

Text(Novitads.title)
   .platformFont()

Обновление: Добавлена ​​демоверсия. Протестировано с Xcode 11.4 / macOS 10.15.4

demo

struct ContentView: View {
    var body: some View {
        VStack {
            Text("Hello World!")
            Text("Hello World!").platformFont()
        }
    }
}
...