美文网首页
iOS 系统字体下载

iOS 系统字体下载

作者: LearningCoding | 来源:发表于2018-10-26 15:33 被阅读2545次

开发中,低版本系统打开 PDF、Word 可能会出现乱码情况,很大的原因是低版本没有该字体造成的。

1、在 mac 上找到字体 PostScript 名称

Find 搜索字体册


781540352115_.pic.jpg

找到对应的字体 PostScript


791540352161_.pic_hd.jpg

注意:你可能会有一个疑问,为什么不把字体文件拖到项目中,在 plist 文件中添加,不就不用下载了吗?
右键点击该字体,在 Find 中显示,我们发现该字体太大了,放到项目中反而得不偿失。
再者,苹果系统字体现在后是统一保存到系统文件下,所有 App 公用,也就是说,如果有其他 App 下载过该字体,咱们的也可以直接使用了。


811540538357_.pic_hd.jpg

2、话不多说,直接上代码

新建系统字体下载管理类

@implementation FontNameManager
+ (instancetype)shareManager {
    static FontNameManager *manager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        manager = [[FontNameManager alloc] init];
    });
    return manager;
}

- (void)asynchronouslySetFontName:(NSString *)fontName
{
    UIFont* aFont = [UIFont fontWithName:fontName size:12.0];
    // If the font is already downloaded
    if (aFont && ([aFont.fontName compare:fontName] == NSOrderedSame || [aFont.familyName compare:fontName] == NSOrderedSame)) {
        // 已经有改字体
        return;
    }
    
    // Create a dictionary with the font's PostScript name.
    NSMutableDictionary *attrs = [NSMutableDictionary dictionaryWithObjectsAndKeys:fontName, kCTFontNameAttribute, nil];
    
    // Create a new font descriptor reference from the attributes dictionary.
    CTFontDescriptorRef desc = CTFontDescriptorCreateWithAttributes((__bridge CFDictionaryRef)attrs);
    
    NSMutableArray *descs = [NSMutableArray arrayWithCapacity:0];
    [descs addObject:(__bridge id)desc];
    CFRelease(desc);
    
    __block BOOL errorDuringDownload = NO;
    CTFontDescriptorMatchFontDescriptorsWithProgressHandler( (__bridge CFArrayRef)descs, NULL,  ^(CTFontDescriptorMatchingState state, CFDictionaryRef progressParameter) {
        
        //NSLog( @"state %d - %@", state, progressParameter);
        
        double progressValue = [[(__bridge NSDictionary *)progressParameter objectForKey:(id)kCTFontDescriptorMatchingPercentage] doubleValue];
        
        if (state == kCTFontDescriptorMatchingDidBegin) {
            NSLog(@" 字体匹配成功 ");
        } else if (state == kCTFontDescriptorMatchingDidFinish) {
            dispatch_async( dispatch_get_main_queue(), ^ {
                
                // Log the font URL in the console
                CTFontRef fontRef = CTFontCreateWithName((__bridge CFStringRef)fontName, 0., NULL);
                CFStringRef fontURL = CTFontCopyAttribute(fontRef, kCTFontURLAttribute);
                NSLog(@"%@", (__bridge NSURL*)(fontURL));
                CFRelease(fontURL);
                CFRelease(fontRef);
                
                if (!errorDuringDownload) {
                    NSLog(@" 字体 %@ 下载完成 ", fontName);
                }
            });
        } else if (state == kCTFontDescriptorMatchingWillBeginDownloading) {
            NSLog(@" 字体开始下载 ");
        } else if (state == kCTFontDescriptorMatchingDidFinishDownloading) {
            NSLog(@" 字体下载完成 ");
            dispatch_async( dispatch_get_main_queue(), ^ {
            });
        } else if (state == kCTFontDescriptorMatchingDownloading) {
            NSLog(@" 下载进度 %.0f%% ", progressValue);
        } else if (state == kCTFontDescriptorMatchingDidFailWithError) {
            // An error has occurred.
            // Get the error message
            NSError *error = [(__bridge NSDictionary *)progressParameter objectForKey:(id)kCTFontDescriptorMatchingError];
            NSString *errorMessage = @"";
            if (error != nil) {
                errorMessage = [error description];
            } else {
                errorMessage = @"ERROR MESSAGE IS NOT AVAILABLE!";
            }
            // Set our flag
            errorDuringDownload = YES;
            
            dispatch_async( dispatch_get_main_queue(), ^ {
                NSLog(@"Download error: %@", errorMessage);
            });
        }
        return (bool)YES;
    });
}

在合适的位置,下载字体:

// 下载 黑体-简 细体
[[FontNameManager shareManager] asynchronouslySetFontName:@"STHeitiSC-Light"];

参考:https://developer.apple.com/library/archive/samplecode/DownloadFont/Listings/DownloadFont_ViewController_m.html

相关文章

  • iOS 字体下载

    参考文章:原文? iOS可以动态的为系统下载字体,这些字体都下载到了系统的/private/var/mobile/...

  • iOS 动态加载字体

    iOS动态加载字体有两种方案 1.加载系统自带字体, 虽然叫系统自带字体, 但还是需要通过网络下载. 系统自带字体...

  • 多种中文字体

    功能介绍 使用动态下载中文字体的 API 可以动态地向 iOS 系统中添加字体文件,这些字体文件都是下载到系统的目...

  • iOS 系统字体下载

    开发中,低版本系统打开 PDF、Word 可能会出现乱码情况,很大的原因是低版本没有该字体造成的。 1、在 mac...

  • iOS下载Apple提供的动态字体

    iOS6.0以后支持在Apple的服务器上下载字体,并在app中应用。下载下来的字体是保存在iOS系统中的,所以并...

  • iOS开发之自定义字体

    iOS 开发中文字默认使用的是系统的字体,但如果需要自定义字体,方法也很简单。 实现步骤 下载需要的字体,并将字体...

  • IOS下载在线字体和系统字体

    老规矩,先上效果图! 字体分类:1. IOS系统提供的字体但不在Apple预装字体列表中2. 服务器上的字体这两种...

  • Xcode如何使用字体文件

    iOS开发中系统自带的字体不能满足需求,需要自定义字体,应该怎么做呢?手把手教你使用 1.拿到下载到的字体文件,拖...

  • iOS 利用runtime 实现全局字体的改变

    # FontChange runtime 字体改变工程下载地址 iOS FontChange iOS 利用runt...

  • iOS字体下载

    iOS6之后的系统,苹果官方支持动态下载官方提供的中文字体。这样不仅可以避免版权问题,也可以减少项目的体积。下面就...

网友评论

      本文标题:iOS 系统字体下载

      本文链接:https://www.haomeiwen.com/subject/egmttqtx.html