首页 > 解决方案 > iOS SwiftUI 更改每个视图的默认字体

问题描述

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

我要避免的是每次都像这样设置它:

.font(.custom("FONT_NAME", size: 20))

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

.font(.caption)

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

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

标签: swifttextfontsswiftuiios13

解决方案


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

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

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

如果你想成为铁杆,你也可以将你的“customFont”函数称为“字体”。

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),
    ...
]

推荐阅读