我正在尝试为我的应用中的每个视图更改 SwiftUI 中的默认字体。
我要避免的是每次都这样设置:
.font(.custom("FONT_NAME", size: 20))
我想要的是仅对所有“文本”视图进行一次更改,最重要的是,我想继续使用修饰符:
.font(.caption)
无需将“文本”视图重置为系统字体。
但是我仍然找不到任何解决方案,有人有吗?
答案 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()
}
}