Object-C 加载 TTF/OTF/TTC 文件

ChatGPT 3.5 国内中文镜像站免费使用啦

零基础 Object-C 学习路线推荐 : Object-C 学习目录 >> Object-C 基础

零基础 Object-C 学习路线推荐 : Object-C 学习目录 >> Object-C 线程

零基础 Object-C 学习路线推荐 : Object-C 学习目录 >> OpenGL ES

零基础 Object-C 学习路线推荐 : Object-C 学习目录 >> GPUImage

零基础 Object-C 学习路线推荐 : Object-C 学习目录 >> AVFoundation

零基础 Object-C 学习路线推荐 : Object-C 学习目录 >> CocoaPods


一.获取系统字体

在文章《 Object-C 获取系统字体和字体名字 》中已经有过讲解,这里不做过多解释啦!

for(NSString *fontfamilyname in [UIFont familyNames])
{
    NSLog(@"family:'%@'",fontfamilyname);
    for(NSString *fontName in [UIFont fontNamesForFamilyName:fontfamilyname])
    {
        NSLog(@"\tfont:'%@'",fontName);
    }
    NSLog(@"-------------");
}

二.加载 TTF/OTF/TTC 文件

1.通过修改 info.plist 文件加载字体

在工程 info.plist 添加一项 Fonts provided by application ,这是个数组,然后添加 key item1 , value 就是 TTF 文件名字,如图:

图片[1]-Object-C 加载 TTF/OTF/TTC 文件-猿说编程

加载字体函数简介


/*
*函数描述:加载字体并返回
*
*参数:
*    fontName : 字体名字,并非字体文件
*    fontSize : 字体大小
*
*返回值:加载成功,返回字体,加载失败,返回nil
*/
+ (UIFont *)fontWithName:(NSString *)fontName size:(CGFloat)fontSize; 

加载字体测试

UIFont *font = [UIFont fontWithName:@"MFQingShu_Noncommercial-Regular" size:12];//就能去到正确的字体。

注意:这个 fontName 不是文件名,而是里面真正的字体名,如上面的 font1.ttf 里面的字体是 MFQingShu_Noncommercial-Regular ;


2.通过代码注册到系统字体

/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:Object-C 加载 TTF/OTF/TTC 文件
//@Time:2021/08/07 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/

/**通过字体文件路径加载字体, 适用于 ttf ,otf,ttc
 */
+ (NSMutableArray*)customFontArrayWithPath:(NSString*)path
{
    @autoreleasepool {
        CFStringRef fontPath = CFStringCreateWithCString(NULL, [path UTF8String], kCFStringEncodingUTF8);
        CFURLRef fontUrl = CFURLCreateWithFileSystemPath(NULL, fontPath, kCFURLPOSIXPathStyle, 0);
        if(!fontPath){
            CFRelease(fontUrl);
            return nil;
        }
        CFRelease(fontPath);
        NSMutableArray *customFontArray = [NSMutableArray array];
#if 0
        NSArray* familys = [UIFont familyNames];
        
        NSLog(@"%lu",(unsigned long)familys.count);
        for (int i = 0; i<[familys count]; i++) {
            
            NSString* family = [familys objectAtIndex:i];
            
            NSArray* fonts = [UIFont fontNamesForFamilyName:family];
            
            for (int j = 0; j<[fonts count]; j++) {
                
                NSLog(@"FontName:%@",[fonts objectAtIndex:j]);
            }
        }
        
        familys = nil;
#endif
        CFArrayRef fontArray = CTFontManagerCreateFontDescriptorsFromURL(fontUrl);
        //注册
        CTFontManagerRegisterFontsForURL(fontUrl, kCTFontManagerScopeNone, NULL);
        if(fontUrl)
            CFRelease(fontUrl);
        for (CFIndex i = 0 ; i < CFArrayGetCount(fontArray); i++){
            
            CTFontDescriptorRef  descriptor = (CTFontDescriptorRef)CFArrayGetValueAtIndex(fontArray, i);
            CTFontRef fontRef = CTFontCreateWithFontDescriptor(descriptor, 10, NULL);
            NSString *fontName = CFBridgingRelease(CTFontCopyName(fontRef, kCTFontPostScriptNameKey));
            if(fontName)
                [customFontArray addObject:fontName];
            if(fontRef)
                CFRelease(fontRef);
            // if(descriptor)
            //    CFRelease(descriptor);
        }
        CFRelease(fontArray);
        return customFontArray;
        
    }
}


/*
调用
NSString* fontFile = [[NSBundle mainBundle] pathForResource:@"SIMHEI.TTF" ofType:nil];
    NSMutableArray* fontArray = [self customFontArrayWithPath:fontFile];
    [fontArray enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSLog(@"font name : %@",obj);
    }];

输出:font name : SimHei
*/

三.猜你喜欢


ChatGPT 3.5 国内中文镜像站免费使用啦
© 版权声明
THE END
喜欢就支持一下吧
点赞2 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容