如何解决SwiftUI-使用多种样式覆盖系统字体
因此,SwiftUI为我们提供了不错的.font()
扩展名,使我们可以设置文本的字体大小,样式,粗细等。这很好地反映了CSS的字体属性,甚至还带有.font(.title)
,.font(.body)
,.font(.caption)
之类的简写。
关于自定义字体,CSS很有意思,它使我们能够从一个或多个文件中导入字体,这些文件共同定义了同一系列中的几种粗细和样式。然后,您可以在文档的顶层声明一个字体系列,从而在所有地方自动使用该字体,然后所有字体声明将自动使用该字体。
iOS允许我们导入自定义字体,但是在使用时似乎不够。我正在寻找iOS反映CSS行为的方法。
对于一个字体家族,我有10个字体文件:5种不同的粗细(轻,常规,半粗体,粗体和超粗体),每个均具有常规和斜体样式。我可以为这些字体实例化UIFont
,但是我正在寻找一种在全球范围内设置此字体家族的方法,以便可以声明.font(.title,weight: .bold)
并使其隐式地使用我的字体家族的粗体变体title
大小。
我知道可以全局替代字体的方法,但是我特别在寻找一种使用同一家族的多种字体来具有自动加粗和斜体功能的方法。如果有一种不错的SwiftUI方法可以做到这一点,那将是首选,但是UIKit解决方案也可以。
编辑:我应该提到的另一件事是,即使没有View
修饰符,我也希望每个.font()
的默认字体都使用我的字体。所以如果我有
Text("Hello,world")
它应该使用默认字体的字体和粗细(我认为这是.body
)。
解决方法
您可以开始定义自定义ViewModifier
来处理选择正确的字体和大小的逻辑:
struct MyFont: ViewModifier {
@Environment(\.sizeCategory) var sizeCategory
public enum TextStyle {
case title
case body
case price
}
var textStyle: TextStyle
func body(content: Content) -> some View {
let scaledSize = UIFontMetrics.default.scaledValue(for: size)
return content.font(.custom(fontName,size: scaledSize))
}
private var fontName: String {
switch textStyle {
case .title:
return "TitleFont-oBld"
case .body:
return "MyCustomFont-Regular"
case .price:
return "MyCustomFont-Mono"
}
}
private var size: CGFloat {
switch textStyle {
case .title:
return 26
case .body:
return 16
case .price:
return 14
}
}
}
在其中,您可以为要在应用程序中重复使用的所有文本样式定义一个枚举。在上面的示例中,您可以使用与本地Font.TextStyle
相同的名称,例如.title
,.body
,也可以定义自己的名称,例如.price
。
对于TextStyle
的每种情况,您必须声明字体的名称及其默认大小。
如果在我的示例中包含sizeCategory
,则字体将适应动态类型。
您还可以在View
上定义扩展名,以便能够以与本机font(_ font: Font?)
相同的方式应用此修饰符。
extension View {
func myFont(_ textStyle: MyFont.TextStyle) -> some View {
self.modifier(MyFont(textStyle: textStyle))
}
}
现在您可以像这样应用它:
Text("Any text will do").myFont(.title)
Text("£3.99").myFont(.price)
对于没有应用修饰符的默认Text
,您可以使用Mahdi BM的解决方案,也可以定义自己的类型:
struct MyText: View {
let text: String
init(_ text: String) {
self.text = text
}
var body: some View {
Text(text).myFont(.body)
}
}
,
您可以通过在视图顶部使用.environment()
修饰符来覆盖系统的默认环境字体。您可以在第一个视图的顶部使用它,以便将其应用于所有视图。
.environment(\.font,.custom("Your_Font_Name",size: theFontSizeYouPrefer))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。