SwiftUI 不会显示自定义字体

Tim*_*Tim 7 ios swift swiftui

我目前正在尝试向我的项目添加自定义字体,但不知何故无法工作。

我已经将 .otf 文件添加到字体文件夹中,检查它是否以我的项目为目标并添加Fonts provided by application到 Info.plist。

struct ContentView: View {
    var body: some View {
        Text("CLOSEST")
          .foregroundColor(Color("primary"))
          .font(Font.custom("HelveticaNowDisplayBold", size: 60))
    }
}
Run Code Online (Sandbox Code Playgroud)

And*_*rew 25

如果您确定Info.plist使用了正确的文件名

在此处输入图片说明

并且字体在应用程序的目标中可用。

在此处输入图片说明

您还需要确保以正确的名称访问字体。

检查字体名称的一种简单方法是将以下内容添加到您的 AppDelegatedidFinishLaunchingWithOptions之前的return true. 或者,如果您正在使用新的 SwiftUI 生命周期,则可以将其添加到.onAppear.

for family in UIFont.familyNames.sorted() {
    let names = UIFont.fontNames(forFamilyName: family)
    print("Family: \(family) Font names: \(names)")
}
Run Code Online (Sandbox Code Playgroud)

这将按系列和名称列出所有字体。

请记住在使用完后将其删除,因为您不需要不必要地打印到控制台。

当我为我的字体做这件事时(我添加了与你相同的字体),我在控制台的可用字体列表中找到了以下内容(参见上面的屏幕截图):

Family: Helvetica Now Display Font names: ["HelveticaNowDisplay-Bold"]
Run Code Online (Sandbox Code Playgroud)

您的字体可能与我的名称不同,请务必注意字体名称可能与文件名不同。这是很多人绊倒的原因,因为他们在需要使用字体名称时尝试使用文件名。

以下测试代码产生:

struct ContentView: View {
    var body: some View {
        Text("Hello")
            .foregroundColor(.blue)
            .font(Font.custom("HelveticaNowDisplay-Bold", size: 60))
    }
}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

有关添加自定义字体的更多信息,请参阅 Apple 的文档


SwiftUI 中的动态类型

如果您使用的是自定义字体,那么您应该考虑设置它,以便它可以随动态类型缩放。

iOS 14

iOS 14 引入了一个新的修饰符,允许您相对于动态字体类型缩放字体。

Text("Hello")
    .font(.custom("HelveticaNowDisplay-Bold", size: 60, relativeTo: .body))
Run Code Online (Sandbox Code Playgroud)

iOS 13

如果您使用的是 iOS 13,则需要付出更多努力才能获得相同的效果。

您首先需要创建一个 ViewModifier。这个视图修改器从环境中侦听大小类别(它实际上并不使用它,但在此处使用它可确保在更新大小类别时更新视图修改器)。

struct ScaledFont: ViewModifier {
    @Environment(\.sizeCategory) var sizeCategory
    var name: String
    var size: CGFloat

    func body(content: Content) -> some View {
       let scaledSize = UIFontMetrics.default.scaledValue(for: size)
        return content.font(.custom(name, size: scaledSize))
    }
}

extension View {
    func scaledFont(name: String, size: CGFloat) -> some View {
        return self.modifier(ScaledFont(name: name, size: size))
    }
}
Run Code Online (Sandbox Code Playgroud)

然后按以下方式使用它:

Text("Hello")
    .scaledFont(name: "HelveticaNowDisplay-Bold", size: 60)
Run Code Online (Sandbox Code Playgroud)

要想写得很好,请查看这篇关于Hacking With Swift 的文章


Nic*_*ick 7

对于那些不再有应用程序/场景委托的人来说,可以将其放入。在您的 <Your_App_Name>App.swift 文件中

init() {
        for family in UIFont.familyNames.sorted() {
            let names = UIFont.fontNames(forFamilyName: family)
            print("Family: \(family) Font names: \(names)")
        }
    }
Run Code Online (Sandbox Code Playgroud)

将工作