【发布时间】:2014-12-06 06:38:57
【问题描述】:
我正在尝试为我的应用动态下载字体,因为我经常想即时添加新字体,并且不想每次都重新提交我的应用。
我已按照其他一些指南尝试从 URL 下载字体文件,将其保存到应用程序的文档目录,然后使用 CGFontCreateWithDataProvider 和 CTFontManagerRegisterGraphicsFont 加载它。
但是,该应用程序始终无法通过“writeToFile”功能并吐出以下行:
println("Failed to save font: \(fontFile)")
我已验证“fontUrl”有效(从调试器复制并粘贴到我的桌面浏览器中)。
另外,'fontPath' 的值最终出现在调试器中,对我来说是正确的:
fontPath = "/Users/James/Library/Developer/CoreSimulator/Devices/E153E1F4-E3FD-4BCE-A40F-433EADF14591/data/Containers/Data/Application/969A248C-A7B3-4768-86E4-68A6C4E20ECF/Documents/Fonts/american_typewriter_medium_bt.ttf"
代码:
// Download and save font file
let nsDocumentDirectory = NSSearchPathDirectory.DocumentDirectory
let nsUserDomainMask = NSSearchPathDomainMask.UserDomainMask
if let paths = NSSearchPathForDirectoriesInDomains(nsDocumentDirectory, nsUserDomainMask, true) {
if paths.count > 0 {
if let documentsDirectory = paths[0] as? String {
let fontPath = documentsDirectory.stringByAppendingPathComponent("Fonts/"+fontFile) as String
let fontUrl = NSURL(string: ApiUrlString + "fonts/" + fontFile)
if let fontData = NSData(contentsOfURL: fontUrl!)
{
if(!fontData.writeToFile(fontPath, atomically: true))
{
println("Failed to save font: \(fontFile)")
return
}
}
else
{
println("Failed to download font from URL: \(fontUrl)")
return
}
// Load Font
let data: NSData? = NSFileManager.defaultManager().contentsAtPath(fontPath)
if (data == nil)
{
println("Failed to load saved font: \(fontFile)")
return
}
var error: Unmanaged<CFError>?
let provider: CGDataProviderRef = CGDataProviderCreateWithCFData(data)
let font: CGFontRef = CGFontCreateWithDataProvider(provider)
if (!CTFontManagerRegisterGraphicsFont(font, &error))
{
println("Failed to register font, error: \(error)")
return
}
println("Successfully saved and registered font: \(fontFile)")
}
}
}
else
{
println("Failed to load documents directory: \(fontFile)")
}
【问题讨论】:
-
你在哪里声明了 var fontFile ?
-
哪里可以解决这个问题。我目前正在搜索有关从安全 URL 下载 .ttf 文件的说明。
标签: ios swift fonts nsdata writetofile