iOS SwiftUI меняет шрифт по умолчанию для каждого просмотра - PullRequest
2 голосов
/ 21 ноября 2019

Я пытаюсь изменить шрифт по умолчанию в SwiftUI для каждого просмотра в моем приложении.

Чего я хочу избежать, это установить его каждый раз так:

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

Я хочу изменить его только один раз для всех видов текста, и самое главное, я хотел бы продолжать использоватьмодификаторы:

.font(.caption)

без сброса текста в системный шрифт.

Но все же я не нашел никакого решения, есть ли у кого-нибудь такое?

1 Ответ

0 голосов
/ 21 ноября 2019

Вы можете создать свой собственный модификатор вида. Вы можете определить, какой размер и шрифт вы хотите использовать для каждого из 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),
    ...
]
...