ios - 如何动态下载字体并将其安装到 iOS 应用程序

标签 ios objective-c fonts truetype

客户希望通过 API 调用下载字体,从而将字体动态添加到 iOS 应用程序。

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

谢谢。

最佳答案

好的,这就是我的做法。首先在需要的地方这样做:

#import <CoreText/CoreText.h>

然后进行 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];

我的 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];
}

最后的 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);
    }
}

关于ios - 如何动态下载字体并将其安装到 iOS 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36376829/

相关文章:

ios - 无法使用 Swift 连接到远程 RabbitMQ 服务器

ios - iOS 中的 PDF 打印预览

objective-c - UITabBarItem 和图标大小

flash - 谷歌字体 API 和 Actionscript

javascript - 在 Fabric.js 中使用远程网络字体初始化加载文本

iphone - 为什么 Wingdings 在 iOS 5 上无法运行?为什么我无法在 iPhone 应用程序中使用 Wingdings?

ios - 使用多个自定义 UITableViewCells

ios - View Controller 不刷新

iphone - Cocoa-Touch:如何进行布局

ios - 将 UIButton 添加到 UICollectionViewCell 时的奇怪行为