SwiftUI不会显示自定义字体

piah890a  于 2022-10-31  发布在  Swift
关注(0)|答案(8)|浏览(279)

我目前正尝试新增自订字型到我的项目,但不知为何无法运作。
我已经将.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))
    }
}
ukqbszuj

ukqbszuj1#

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

请注意,如果您使用的是Xcode 13,您可能没有预期的Info.plist。此SO answer说明了您可以在哪里找到它。
字体在应用程序的目标中可用。

您还需要确保使用正确的名称访问字体。
检查字体名称的一个简单方法是将以下内容添加到return true之前的didFinishLaunchingWithOptions中的AppDelegate中。或者,如果您正在使用新的SwiftUI生命周期,则可以将其添加到.onAppear中。

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

这将按系列和名称列出所有字体。
只要记住删除它,一旦你已经完成使用,因为你不需要不必要的打印到控制台。
当我为我的字体做这件事时(我已经添加了和你一样的字体),我在控制台的可用字体列表中发现了以下内容(见上面的屏幕截图):

Family: Helvetica Now Display Font names: ["HelveticaNowDisplay-Bold"]

您的字体可能有一个不同的名称,需要注意的是,字体名称可能与文件名不同。这是很多人遇到的问题,因为他们在需要使用字体名称时尝试使用文件名。
以下测试代码将生成:

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

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

SwiftUI中的动态类型

如果您使用的是自订字型,则应考虑将其设定为随动态文字缩放。
第14版iOS操作系统
iOS 14引入了一个新的修饰符,可让您相对于“动态字体类型”缩放字体。

Text("Hello")
    .font(.custom("HelveticaNowDisplay-Bold", size: 60, relativeTo: .body))

第13版iOS操作系统
如果你使用的是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))
    }
}

然后以下列方式使用:

Text("Hello")
    .scaledFont(name: "HelveticaNowDisplay-Bold", size: 60)

对于一个真正好的写了看看这个职位上的Hacking With Swift

qv7cva1a

qv7cva1a2#

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

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

会起作用

z9zf31ra

z9zf31ra3#

你需要在info.plist中包含字体的扩展名(例如.ttf)。我在youtube上看到了一些教程,其中没有包含它,但对我来说,没有它就不行。

mec1mxoz

mec1mxoz4#

我也有同样的问题,
当我省略了“-Regular”时,它对我很有效,但是在info.plist中我用它写了它。

thtygnil

thtygnil5#

我也遇到了同样的问题。下面的步骤为我解决了这个问题。我目前使用的是Xcode 11.4.1
1.创建故事板,添加标签,并在检查器中选择您的字体作为标签的字体。
1.在模拟器中构建您的应用
1.检查已安装的字体:

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

1.如果它出现了,您也可以通过编程方式使用它
这里也列出了Common mistakes with adding custom fonts

ars1skjm

ars1skjm6#

我做了安德鲁斯回答中提到的一切,但仍然没有工作。原来我忘记了实际安装字体在我的mac上双击.tff文件下载后。

q1qsirdb

q1qsirdb7#

有时字体文件名和字体实际名称不同。
在我的例子中,我的文件名是SCRIPTIN.ttf,但实际的字体名称是Scriptina。
我通过在App.swift文件中运行以下函数发现了这一点。

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

只需将此文件放在App.swift文件中的此函数之后,然后运行该应用程序。您将得到一个包含所有已加载文件及其名称(包括新添加的字体)的列表。

var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
  • 谢谢-谢谢
vyswwuz2

vyswwuz28#

Xcode 13按目标,然后信息,类型字体提供的应用程序和添加项目字体名称一样的图像

相关问题