Xcode Objective-C:下载自定义字体并将其显示在UILabel中

Xcode Objective-C:下载自定义字体并将其显示在UILabel中,objective-c,xcode,fonts,Objective C,Xcode,Fonts,首先:是否可以下载自定义字体并将其显示在UILabel中 我正在使用此代码从internet下载自定义字体,并将其显示在UILabel中,但它不起作用 #import "ViewController.h" @interface ViewController () @end @implementation ViewController @synthesize txt_UserName; - (void)viewDidLoad { [super viewDidLoad];

首先:是否可以下载自定义字体并将其显示在UILabel中

我正在使用此代码从internet下载自定义字体,并将其显示在UILabel中,但它不起作用

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

@synthesize txt_UserName;

- (void)viewDidLoad {
    [super viewDidLoad];

    // 1
    NSString *dataUrl = @"https://dl.dafont.com/dl/?f=stars_fighters";
    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];


}

- (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);

    CTFontRef ctFont = CTFontCreateWithGraphicsFont(font, 30, NULL, NULL);
    UIFont *uiFont = CFBridgingRelease(ctFont);

    dispatch_async(dispatch_get_main_queue(), ^{
        [self.txt_UserName setFont:uiFont];
    });

    [self 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);
    }
}

@end  
#导入“ViewController.h”
@界面视图控制器()
@结束
@实现视图控制器
@合成txt_用户名;
-(无效)viewDidLoad{
[超级视图下载];
// 1
NSString*数据URL=@”https://dl.dafont.com/dl/?f=stars_fighters";
NSURL*url=[NSURL URLWithString:dataUrl];
// 2
NSURLSessionDataTask*downloadTask=[[NSURLSession sharedSession]dataTaskWithURL:url completionHandler:^(NSData*数据,NSURLRResponse*响应,NSError*错误){
//4:在这里处理响应
如果(错误==nil){
NSLog(@“无错误!”);
如果(数据!=nil){
NSLog(@“有数据!”);
[自动加载字体:数据];
}
}否则{
NSLog(@“%@”,错误。本地化描述);
}
}];
// 3
[下载任务恢复];
}
-(void)加载字体:(NSData*)数据
{
NSData*inData=数据;
CFErrorRef错误;
CGDataProviderRef provider=CGDataProviderCreateWithCFData((CFDataRef)数据);
CGFontRef font=CGFontCreateWithDataProvider(provider);
如果(!CTFontManagerRegisterGraphicsFont(字体和错误)){
CFStringRef errorDescription=CFErrorCopyDescription(错误);
NSLog(@“无法加载字体:%@”,错误描述);
//CFRelease(错误描述);
}
//CFRelease(字体);
//CFRelease(提供者);
CTFontRef ctFont=CTFontCreateWithGraphicsFont(字体,30,NULL,NULL);
UIFont*UIFont=CfBrigingRelease(ctFont);
dispatch\u async(dispatch\u get\u main\u queue()^{
[self.txt_用户名setFont:uiFont];
});
[自我测试];
}
-(无效)测试
{
NSArray*fontFamilies=[UIFont familyNames];
对于(int i=0;i<[fontFamilies count];i++){
NSString*fontFamily=[fontFamilies对象索引:i];
NSArray*fontNames=[UIFont fontNamesForFamilyName:[fontFamilies对象索引:i]];
NSLog(@“%@:%@”,fontFamily,fontNames);
}
}
@结束
无论如何,我得到了这个错误:加载字体失败:操作无法完成。无效参数


在自定义字体的位置,我得到了一个默认的iOS字体。

当然可以下载自定义字体并在UILabel中显示它,以下是我的代码:

步骤1:假设字体文件已保存在沙盒路径
Documents/StarsFighters.ttf
,加载字体并获取字体名称(在您的\u CLASS.m文件中):

+ (NSString *)loadFontAndReturnFontName {
    NSString *imgFilePath = [NSString stringWithFormat:@"%@/Documents/StarsFighters.ttf",NSHomeDirectory()];
    NSURL *fontUrl = [NSURL fileURLWithPath:imgFilePath];
    CGDataProviderRef fontDataProvider =  CGDataProviderCreateWithURL((__bridge CFURLRef)fontUrl);
    CGFontRef fontRef = CGFontCreateWithDataProvider(fontDataProvider);
    CGDataProviderRelease(fontDataProvider);
    CTFontManagerRegisterGraphicsFont(fontRef, NULL);
    NSString *fontName = CFBridgingRelease(CGFontCopyPostScriptName(fontRef));
    return fontName;
}
步骤2:使用自定义字体

NSString *fontname = [YOUR_CLASS loadFontAndReturnFontName];
//fontname is @"StarsFighters",best set it to a global variable or save it
YOUR_LABEL.font = [UIFont fontWithName:fontname size:18.0];

您的URL下载一个
.zip
文件,其中包含2个
.ttf
文件。您需要解压缩并将文件存储在本地。谢谢!下载字体时,您使用的代码与我的相同?另外,我在控制台上得到:CoreText注意:Client requested name“.Helvetica NeueUI”,它将得到TimesNewRomanPSMT,而不是预期的字体。所有系统UI字体访问都应通过适当的API,如CTFontCreateUIFontForLanguage()或+[UIFont systemFontOfSize:]。2020-02-03 09:23:09.522915+0100测试字体[285:6177]CoreText注意:在CTFontLogSystemFontNameRequest上设置一个断点以进行调试。您的下载链接是一个zip文件,您需要解压缩其中的ttf文件。为了方便起见,我直接使用以下链接进行了测试:
https://raw.githubusercontent.com/wooodypan/AlgorithmWithMac/master/AlgorithmWithMac/Stars%20Fighters.ttf
您可以使用
ZipArchive
解压您的zip文件: