我正在尝试在我的 SwiftUI 应用程序中实现自定义字体 (OpenSans)。
我的大多数视图都很乐意采用该字体,因此我知道它正在从捆绑包中正确加载。但是,有几个地方存在问题。
第一个是导航栏,但我可以使用外观代理修改
titleTextAttributes
字典来解决这个问题。
另一个有问题的部分,也是我尚未解决的部分,标签栏按钮。无论我尝试在哪里修改字体,它似乎都不起作用 - 也许 TabView API 内部正在修改字体?这是我尝试过的(我使用 SwiftGen 作为资源访问器):
将字体修改器应用到由
Label
修改器提供的 tabItem
视图 (TabView {
Text("My tab content here...")
.tabItem {
Label(
title: {
Text(SFAssetVerificationUI.L10n.audits)
.font(FontFamily.OpenSans.extraBold.swiftUIFont(fixedSize: 18))
},
icon: { SFAssetVerificationUI.Asset.icTabAudits.swiftUIImage }
)
}
}
将字体修改器应用到作为
Label
视图的 label
参数提供的 Tab
视图 (>=iOS 18)。
TabView {
Tab(
content: {
Text("My tab content here...")
},
label: {
Label(
title: {
Text(SFAssetVerificationUI.L10n.audits)
.font(FontFamily.OpenSans.extraBold.swiftUIFont(fixedSize: 18))
},
icon: { SFAssetVerificationUI.Asset.icTabAudits.swiftUIImage }
)
}
)
}
将上述两个
Label
视图替换为包含 VStack
视图和 Image
视图的 Text
。
TabView {
Tab(
content: {
Text("My tab content here...")
},
label: {
VStack {
SFAssetVerificationUI.Asset.icTabAudits.swiftUIImage
Text(SFAssetVerificationUI.L10n.audits)
.font(FontFamily.OpenSans.extraBold.swiftUIFont(fixedSize: 18))
}
}
)
}
在
titleTextAttributes
外观代理上设置 UITabBarItem
,适用于 normal
和 selected
状态。
UITabBarItem.appearance().setTitleTextAttributes([.font: FontFamily.OpenSans.extraBold.font(size: 18)], for: .normal)
UITabBarItem.appearance().setTitleTextAttributes([.font: FontFamily.OpenSans.extraBold.font(size: 18)], for: .selected)
为 UITabBar 项目设置自定义字体确实很棘手,因为 SwiftUI 中的 TabView 不提供直接的 API 来自定义 UITabBarItems 上的字体。然而,使用 UITabBarItem.appearance() 来设置字体通常是推荐的方法。这是一个快速解决方案:
确保您的 OpenSans 字体已在项目中正确注册。 应用 UITabBarItem.appearance() 全局设置字体。 具体方法如下:
import SwiftUI
@main
struct MyApp: App {
init() {
// Set custom font for UITabBarItem appearance
let customFont = UIFont(name: "OpenSans-ExtraBold", size: 18)!
UITabBarItem.appearance().setTitleTextAttributes([.font: customFont], for: .normal)
UITabBarItem.appearance().setTitleTextAttributes([.font: customFont], for: .selected)
}
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
struct ContentView: View {
var body: some View {
TabView {
Text("My tab content here...")
.tabItem {
Label("Audits", systemImage: "doc.text")
}
Text("Another tab content")
.tabItem {
Label("Reports", systemImage: "chart.bar")
}
}
}
}
此方法应该适用于 iOS 17 之前的 iOS 版本(包括 iOS 17)。对于 iOS 18+,SwiftUI 的本机 API 可以直接在 TabView 中提供更大的灵活性。