是否可以从网上下载.ttf文件并将其存储在iPhone上,然后用于标签和其他所有内容?因为我的客户希望从数据库控制字体,而不是立即将字体放入Xcode项目中。
因此,如果他将来想要更改字体,他将向数据库添加新字体,应用程序将在Web上识别新字体(这已经完成了图像,不是问题),下载它并用作字体。
谢谢。
是否可以从网上下载.ttf文件并将其存储在iPhone上,然后用于标签和其他所有内容?因为我的客户希望从数据库控制字体,而不是立即将字体放入Xcode项目中。
因此,如果他将来想要更改字体,他将向数据库添加新字体,应用程序将在Web上识别新字体(这已经完成了图像,不是问题),下载它并用作字体。
谢谢。
实际上,您可以像这样动态地向iOS运行时添加字体:
NSData *fontData = /* your font-file data */;
CFErrorRef error;
CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)inData);
CGFontRef font = CGFontCreateWithDataProvider(provider);
if (! CTFontManagerRegisterGraphicsFont(font, &error)) {
CFStringRef errorDescription = CFErrorCopyDescription(error)
NSLog(@"Failed to load font: %@", errorDescription);
CFRelease(errorDescription);
}
CFRelease(font);
CFRelease(provider);
来源:这篇博客文章来自Marco Arment。
var uiFont : UIFont?
let fontData = data
let dataProvider = CGDataProviderCreateWithCFData(fontData)
let cgFont = CGFontCreateWithDataProvider(dataProvider)
var error: Unmanaged<CFError>?
if !CTFontManagerRegisterGraphicsFont(cgFont, &error)
{
print("Error loading Font!")
} else {
let fontName = CGFontCopyPostScriptName(cgFont)
uiFont = UIFont(name: String(fontName) , size: 30)
}
Swift 4的解决方案是通过扩展实现的:
extension UIFont {
/**
A convenient function to create a custom font with downloaded data.
- Parameter data: The local data from the font file.
- Parameter size: Desired size of the custom font.
- Returns: A custom font from the data. `nil` if failure.
*/
class func font(withData data: Data, size: CGFloat) -> UIFont? {
// Convert Data to NSData for convenient conversion.
let nsData = NSData(data: data)
// Convert to CFData and prepare data provider.
guard let cfData = CFDataCreate(kCFAllocatorDefault, nsData.bytes.assumingMemoryBound(to: UInt8.self), nsData.length),
let dataProvider = CGDataProvider(data: cfData),
let cgFont = CGFont(dataProvider) else {
print("Failed to convert data to CGFont.")
return nil
}
// Register the font and create UIFont.
var error: Unmanaged<CFError>?
CTFontManagerRegisterGraphicsFont(cgFont, &error)
if let fontName = cgFont.postScriptName,
let customFont = UIFont(name: String(fontName), size: size) {
return customFont
} else {
print("Error loading Font with error: \(String(describing: error))")
return nil
}
}
}
使用方法:
let customFont = UIFont.font(withData: data, size: 15.0)