首先,在iOS中,使用字体文件(网络动态下载或者copy到bundle的方式)并不难,只需要在使用前动态加载就可以:
+ (void) loadCustomFont:(NSString*)fontFileName{
NSString *fontPath = [[NSBundle MainBundle] pathForResource:fontFileName ofType:nil];
if (!fontPath) {
NSLog(@"Failed to load font: %@", fontFileName);
return;
}
NSData *inData = [NSData dataWithContentsOfFile:fontPath];
CFErrorRef error;
CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge 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);
}
但是本人就遇到了一个比较奇葩的情况,有一个字体叫做Bebas Neue,有book,regular,bold,thin等类型,但是动态加载以后,虽然通过查询font family啥的,能看到这些类型,可是通过[UIFont fontWithName:@"BebasNeueBook" size:72]
获取到的字体,并不是book字体,而是比较粗的字体,这就尴尬了,怎么才能获取到正确的字体呢?StackOverflow无果,自己尝试,发现了一个叫做UIFontDescriptor的东东,这个类可以很详细的描述字体信息,于是曲线救国,通过 [UIFont fontWithDescriptor:[UIFontDescriptor fontDescriptorWithName:@"BebasNeueBook" size:72] size:72]
就可以正确加载这个字体了,最后看起来效果棒棒哒。
为了方便使用,我封装了一个方法:
- (UIFont*)loadFontWithName:(NSString*)fontName size:(float)size{
return [UIFont fontWithDescriptor:[UIFontDescriptor fontDescriptorWithName:fontName size:size] size:size];
}
网友评论