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

时间:2016-04-02 17:53:02

标签: ios objective-c fonts true-type-fonts

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

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

感谢。

1 个答案:

答案 0 :(得分:10)

好的,我的表现就是这样。首先需要这样做:

body {
    padding-left: 180px;
    padding-right: 250px;
    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
}

.logo {
   height: 80px;
   width: 300px;
}

.top-search {
    height: 50px;
    width: 400px;
    margin-top: 10px;
}

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

#import <CoreText/CoreText.h>

我的loadFont数据在这里:

// 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];

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

- (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];
}