Swift中WKWebView自定义字体无法生效问题求助
解决WKWebView自定义字体不生效的问题
我之前也碰到过一模一样的情况,WKWebView加载本地自定义字体确实有几个容易踩的小坑,咱们一步步来排查解决:
1. 确认字体文件已正确配置到项目
- 先检查你的
OpenSans-Bold.ttf字体文件是不是真的添加到Xcode项目里了,一定要确保勾选了对应的Target——可以在添加文件时的弹窗里确认,或者选中字体文件后,在右侧文件检查器的「Target Membership」里打勾。 - 必须在项目的
Info.plist中添加Fonts provided by application字段(数组类型),把字体的完整文件名(比如OpenSans-Bold.ttf)添加进去,这一步是系统识别自定义字体的关键,漏了肯定用不了。
2. 验证字体的实际名称(最容易踩坑的点!)
很多时候文件名和字体的实际名称不一样!比如文件名叫OpenSans-Bold.ttf,但字体内部的名称可能是Open Sans Bold(带空格)或者其他格式。你可以在App启动时打印所有可用字体,找到OpenSans对应的准确名称:
for family in UIFont.familyNames.sorted() { let fontNames = UIFont.fontNames(forFamilyName: family) print("字体家族: \(family) → 可用字体: \(fontNames)") }
运行后在控制台找OpenSans相关的输出,比如可能看到字体家族: Open Sans → 可用字体: ["OpenSans-Bold", ...],那你在HTML里必须用这个准确的名称,不能凭文件名瞎猜。
3. 给WKWebView设置正确的baseURL
当调用loadHTMLString时,如果baseURL设为nil,WKWebView可能无法访问本地的字体资源。你可以把baseURL设为项目的bundle路径,让WebView能找到本地字体:
let htmlString = "<span style=\"font-family: 'OpenSans-Bold'; font-size: 30; color: white\">\(Utils.aboutUsText)</span>" if let bundleURL = Bundle.main.bundleURL { webView.loadHTMLString(htmlString, baseURL: bundleURL) }
4. 用CSS @font-face显式声明字体(兜底方案)
如果上面的步骤都没用,试试在HTML里用CSS显式引入字体,这样能强制WebView加载指定的字体文件:
let fontCSS = """ @font-face { font-family: 'OpenSans-Bold'; src: url('OpenSans-Bold.ttf') format('truetype'); } """ let htmlString = """ <html> <head> <style>\(fontCSS)</style> </head> <body> <span style=\"font-family: 'OpenSans-Bold'; font-size: 30; color: white\">\(Utils.aboutUsText)</span> </body> </html> """ if let bundleURL = Bundle.main.bundleURL { webView.loadHTMLString(htmlString, baseURL: bundleURL) }
按这个顺序试下来,大概率能解决问题——我之前就是栽在字体名称不对的坑里,明明文件名是OpenSans-Bold,实际字体名称却是Open Sans Bold!
内容的提问来源于stack exchange,提问作者iYousafzai
相关产品推荐
相关产品推荐

