iOS SwiftUI 更改每个视图的默认字体

And*_*tto 8 fonts text swift ios13 swiftui

我试图更改默认字体SwiftUI在我的应用程序的每个视图。

我想避免的是每次都这样设置:

.font(.custom("FONT_NAME", size: 20))
Run Code Online (Sandbox Code Playgroud)

我想要的是为所有 Text 视图只更改一次,最重要的是,我想继续使用修饰符:

.font(.caption)
Run Code Online (Sandbox Code Playgroud)

无需将文本视图重置为系统字体。

但是我仍然没有找到任何解决方案,有人有吗?

Kev*_*inP 5

您可以构建自己的视图修改器。您可以定义内部每个 UIFont.TextStyle 使用的大小和字体private var fontDescriptions:

现在您可以像这样在视图上调用此修饰符。Text("my text").customFont(.headline)

请记住,这个还实现了字体缩放功能。

如果你想成为硬核,你也可以将你的“customFont”函数称为“font”。

extension View {
    func customFont(_ textStyle: UIFont.TextStyle) -> ModifiedContent<Self, CustomFont> {
        return modifier(CustomFont(textStyle: textStyle))
    }
}

struct CustomFont: ViewModifier {
    let textStyle: UIFont.TextStyle

    /// Will trigger the refresh of the view when the ContentSizeCategory changes.
    @Environment(\.sizeCategory) var sizeCategory: ContentSizeCategory

    func body(content: Content) -> some View {

        guard let fontDescription = fontDescriptions[textStyle] else {

            print("textStyle nicht vorhanden: \(textStyle)")

            return content.font(.system(.body));
        }

        let fontMetrics = UIFontMetrics(forTextStyle: textStyle)
        let fontSize = fontMetrics.scaledValue(for: fontDescription.1)

        return content.font(.custom(fontDescription.0, size: fontSize))
    }
}

/// Define the custom fonts to use, depending on the TextStyle.
typealias CustomFontDescription = (String, CGFloat)
private var fontDescriptions: [UIFont.TextStyle: CustomFontDescription] = [
    .headline: ("MYFONT", SIZE),
    .subheadline: ("MYFONT", SIZE),
    ...
]
Run Code Online (Sandbox Code Playgroud)