我想允许我的应用程序用户在应用程序中使用自己的字体,方法是将它们复制到Documents目录(通过iTunes)。但是,我找不到以这种方式使用自定义字体的方法,因为正确的方法取决于在应用的 Info.plist 中使用 UIAppFonts 键
有没有办法在运行时覆盖它?
感谢。
答案 0 :(得分:19)
我知道这是一个老问题,但我今天也试图做同样的事情并找到了使用CoreText和CGFont的方法。
首先确保添加CoreText框架和
#import <CoreText/CoreText.h>
然后这应该这样做(在这个例子中我使用的是我之前下载并保存到Documents目录内的fonts目录的字体):
NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString * documentsDirectory = [paths objectAtIndex:0];
NSString * fontPath = [documentsDirectory stringByAppendingPathComponent:@"Fonts/Chalkduster.ttf"];
NSURL * url = [NSURL fileURLWithPath:fontPath];
CGDataProviderRef fontDataProvider = CGDataProviderCreateWithURL((__bridge CFURLRef)url);
CGFontRef newFont = CGFontCreateWithDataProvider(fontDataProvider);
NSString * newFontName = (__bridge NSString *)CGFontCopyPostScriptName(newFont);
CGDataProviderRelease(fontDataProvider);
CFErrorRef error;
CTFontManagerRegisterGraphicsFont(newFont, &error);
CGFontRelease(newFont);
UIFont * finalFont = [UIFont fontWithName:newFontName size:20.0f];
希望它有助于任何人绊倒这个问题!
答案 1 :(得分:6)
试试这个
#import "MBProgressHUD.h"
#import <CoreText/CoreText.h>
- (void)viewDidLoad
{
NSURL *fileNameURL=[NSURL URLWithString:@"http://www.ge.tt/api/1/files/6d7jEnk/0/"];
NSMutableURLRequest *filenameReq=[[NSMutableURLRequest alloc] initWithURL:fileNameURL];
NSData *responseData=[NSURLConnection sendSynchronousRequest:filenameReq returningResponse:nil error:nil];
NSDictionary* json = [NSJSONSerialization
JSONObjectWithData:responseData
options:kNilOptions
error:nil];
NSString *fontFileName=[[[json valueForKey:@"filename"] componentsSeparatedByString:@"."] objectAtIndex:0];
NSLog(@"file name is %@",fontFileName);
NSURL *url=[NSURL URLWithString:@"http://www.ge.tt/api/1/files/6d7jEnk/0/blob?download"];
NSMutableURLRequest *request=[[NSMutableURLRequest alloc] initWithURL:url];
__block NSError *error;
__block NSURLResponse *response;
MBProgressHUD *hud=[MBProgressHUD showHUDAddedTo:self.view animated:YES];
hud.labelText=@"Changing Font..";
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
NSString *rootPath=[NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"Documents"]];
NSString *filePath=[rootPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.ttf",fontFileName]];
dispatch_async(dispatch_get_main_queue(), ^{
[MBProgressHUD hideAllHUDsForView:self.view animated:YES];
NSFileManager *fm=[NSFileManager defaultManager];
if (![fm fileExistsAtPath:filePath]) {
[urlData writeToFile:filePath atomically:YES];
}
NSString *rootPath=[NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"Documents"]];
NSString *filePath=[rootPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.ttf",fontFileName]];
NSURL * fonturl = [NSURL fileURLWithPath:filePath];
CGDataProviderRef fontDataProvider = CGDataProviderCreateWithURL((__bridge CFURLRef)fonturl);
CGFontRef newFont = CGFontCreateWithDataProvider(fontDataProvider);
NSString * newFontName = (__bridge NSString *)CGFontCopyPostScriptName(newFont);
CGDataProviderRelease(fontDataProvider);
CFErrorRef fonterror;
CTFontManagerRegisterGraphicsFont(newFont, &fonterror);
CGFontRelease(newFont);
UIFont * finalFont = [UIFont fontWithName:newFontName size:20.0f];
[txt_UserName setFont:finalFont];
});
});
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
看起来像
答案 2 :(得分:1)
Zynga的人员创建了一个类,可以加载任何自定义字体:FontLabel。
您必须在应用启动时(例如在您的应用代理中)为您要在应用中使用的每种字体调用[FontManager loadFont:]
。
因此,在Documents文件夹中迭代以寻找.ttf文件是非常重要的(该库仅适用于ttf字体)。
注意:这个类使用UILabel的子类。
答案 3 :(得分:0)
extension UIFont {
func registerNewFontFromAppBundle(withSize: CGFloat) {
guard let filePath = Bundle.main.url(forResource: "Art Brewery", withExtension: "ttf") else { return }
guard let dataProvider = CGDataProvider(url: filePath as CFURL), let cgFont = CGFont(dataProvider) else { return }
var error: Unmanaged<CFError>?
if !CTFontManagerRegisterGraphicsFont(cgFont, &error)
{
print("Error registering Font")
} else {
guard let uiFont = UIFont(name: cgFont.postScriptName! as String, size: withSize) else { return }
CurrentTheme.shared.currentFont = uiFont
}
}
func registerNewFontFromDownloadedFiles(withSize: CGFloat) {
guard let filePath = FileUtils().getFilePathAtDocumentFolder(fileName: "Art Brewery.ttf") else { return }
if FileUtils.fileExists(atPath: filePath) {
let url = URL(fileURLWithPath: filePath)
guard let dataProvider = CGDataProvider(url: url as CFURL), let cgFont = CGFont(dataProvider) else { return }
var error: Unmanaged<CFError>?
if !CTFontManagerRegisterGraphicsFont(cgFont, &error)
{
print("Error registering Font")
} else {
guard let uiFont = UIFont(name: cgFont.postScriptName! as String, size: withSize) else { return }
CurrentTheme.shared.currentFont = uiFont
CurrentTheme.shared.currentFontName = cgFont.postScriptName! as String
}
}
}
}
用法:
UIFont.registerNewFontFromAppBundle(withSize: 30)
UIFont.registerNewFontFromDownloadedFiles(withSize: 30)
mylabel.font = CurrentTheme.shared.currentFont // saved the font in a Singleton
or
mylabel.font = UIFont(name: CurrentTheme.shared.currentFontName, size: 30) // Saved the Font name to reuse