如何动态下载和安装字体到iOS应用程序

MSc*_*ler 5 fonts objective-c truetype ios

客户希望通过API调用下载它们来动态地将字体添加到iOS应用程序.

这可能吗?我挖掘的所有资源都显示了如何手动将.ttf文件拖到Xcode并将其添加到plist中.是否可以下载字体并以编程方式在即时客户端使用它?

谢谢.

MSc*_*ler 10

好的,所以这就是我做的.首先需要这样做:

#import <CoreText/CoreText.h>
Run Code Online (Sandbox Code Playgroud)

然后进行NSURLSession调用.我的客户将字体上传到亚马逊的S3.所以在需要时这样做:

// 1
NSString *dataUrl = @"http://client.com.s3.amazonaws.com/font/your_font_name.ttf";
NSURL *url = [NSURL URLWithString:dataUrl];

// 2
NSURLSessionDataTask *downloadTask = [[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    // 4: Handle response here
    if (error == nil) {
        NSLog(@"no error!");
        if (data != nil) {
            NSLog(@"There is data!");
            [self loadFont:data];
        }
    } else {
        NSLog(@"%@", error.localizedDescription);
    }
}];

// 3
[downloadTask resume];
Run Code Online (Sandbox Code Playgroud)

我的loadFont数据在这里:

- (void)loadFont:(NSData *)data
{
    NSData *inData = data;
    CFErrorRef error;
    CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)data);
    CGFontRef font = CGFontCreateWithDataProvider(provider);
    if(!CTFontManagerRegisterGraphicsFont(font, &error)){
        CFStringRef errorDescription = CFErrorCopyDescription(error);
        NSLog(@"Failed to load font: %@", errorDescription);
        CFRelease(errorDescription);
    }
    CFRelease(font);
    CFRelease(provider);

    [self fontTest];
}
Run Code Online (Sandbox Code Playgroud)

那么最后的fontTest只是为了确保字体实际存在,而在我的情况下,它就是!而且,当应用程序在需要的地方运行时,它会显示出来.

- (void)fontTest
{
    NSArray *fontFamilies = [UIFont familyNames];
    for (int i = 0; i < [fontFamilies count]; i++) {
        NSString *fontFamily = [fontFamilies objectAtIndex:i];
        NSArray *fontNames = [UIFont fontNamesForFamilyName:[fontFamilies objectAtIndex:i]];
        NSLog (@"%@: %@", fontFamily, fontNames);
    }
}
Run Code Online (Sandbox Code Playgroud)