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

时间:2019-11-21 09:04:19

标签: swift text fonts swiftui ios13

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

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

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

我想要的是仅对所有“文本”视图进行一次更改,最重要的是,我想继续使用修饰符:

.font(.caption)

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

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

2 个答案:

答案 0 :(得分:0)

您可以构建自己的视图修饰符。您可以为private var fontDescriptions:中的每个UIFont.TextStyle定义要使用的大小和字体。

现在,您可以像这样在视图上调用此修饰符。 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),
    ...
]

答案 1 :(得分:0)

您可以使用视图修饰符解决您的情况。

@available(iOS 13.0, *)
struct CustomText: ViewModifier {
    func body(content: Content) -> some View {
        content
            .font(.custom("FONT_NAME", size: textSize(textStyle: .headline)))
            .background(Color.blue)
            .foregroundColor(Color.white)
           //Other customization
    }
}
//For Accessibility feature
func textSize(textStyle: UIFont.TextStyle) -> CGFloat {
   return UIFont.preferredFont(forTextStyle: textStyle).pointSize
}
@available(iOS 13.0, *)
struct ContentView: View {
    var body: some View {
        Text("Hello, SwiftUI")
            .modifier(CustomText())
            .font(.caption) // You can still change the font .
    }
}

@available(iOS 13.0, *)
struct SwiftUIView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}