iOS中字体的使用

有三种方式:
一、使用系统随附的字体
在使用之前,先把支持的所有字体打印出来,确保存在再使用:

// 打印所有的系统已存在的字体
static void dumpAllFonts() {
    NSInteger totalCount;
    for (NSString *familyName in [UIFont familyNames]) {
        NSArray *familyNameArr = [UIFont fontNamesForFamilyName:familyName];
        NSLog(@"familyName:%@   count=%ld", familyName,[familyNameArr count]);
        NSInteger tempCount = [familyNameArr count];
        totalCount += tempCount;
        for (NSString *fontName in familyNameArr) {
            NSLog(@"++++     %@", fontName);
        }
    }
    NSLog(@"totalCount=%ld",totalCount);
}

使用就很简单了:

[UIFont fontWithName:@"字体的名字" size:14]

二、从外界拖进来的静态字体(也就是你的UI给你的字体,.ttf或者.ttc等格式的文件)
在使用前双击资源文件,mac会默认用‘字体册’打开,这时你会看到一些相关信息:'PostScript名称'对应是字体fontName,以及字体所在的familyName,‘语言’:对应的是支持的语言

接下来就是开始了:
1、把资源拖进工程
2、TARGETS->Info->添加‘Fonts provide by application’项,如下:
这里写图片描述
3、TARGETS->Build Phases ->Copy Bundle Resources
这里写图片描述
4、到这里再次打印所有的字体,应该可以找到目标字体名,然后就可以像使用已存在的系统字体那样使用了。
这里写图片描述

三、下载系统字体使用
使用系统的API先把字体下载下来,然后就可以像普通已安装字体使用了。
这里是App可以根据需要安装的字体:https://support.apple.com/zh-cn/HT202599
这里是苹果提供的Demo:https://support.apple.com/zh-cn/HT202599
我是把下载字体的api简单地封装了一下,AsyDownloadSystemFont:

/**
 *  下载系统提供的字体 (异步)
 */

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

typedef void(^DownloadingBlock)(CGFloat progressValue);

typedef void(^DownloadSuccessBlock)(void);

typedef void(^DownloadErrocBlock)(NSString *errorMsg);


@interface AsyDownloadSystemFont : NSObject

/**
 *  判断该字体有没有下载过
 *
 *  @param fontName 字体名字 (不是文件夹的名字)
 *
 *  @return Yes:已经下载过  NO:没有下载过
 */
+(BOOL)isExistWithFontName:(NSString *)fontName;

/**
 *  异步下载系统提供的字体
 *
 *  @param fontName        字体名字 (不是文件夹的名字)
 *  @param loadingCallBack 下载中的回调   (可以改变进度条的值)
 *  @param sucessCallBack  下载成功的回调 (可以进行UI刷新)
 *  @param errorCalBack    下载失败的回调
 */
+(void)asyDownLoadFontWithFontName:(NSString *)fontName
                       downloading:(DownloadingBlock)loadingCallBack
                   downloadSuccess:(DownloadSuccessBlock)sucessCallBack
                     downloadError:(DownloadErrocBlock)errorCalBack;

@end

#import "AsyDownloadSystemFont.h"
#import <CoreText/CoreText.h>

@implementation AsyDownloadSystemFont

#pragma mark - Public Methods

+(BOOL)isExistWithFontName:(NSString *)fontName {

    UIFont *aFont = [UIFont fontWithName:fontName size:12.];
    if (aFont && ([aFont.fontName compare:fontName] == NSOrderedDescending || [aFont.familyName compare:fontName] == NSOrderedSame)) {
        NSLog(@"存在");
        return YES;
    }
    NSLog(@"不存在");
    return NO;
}

+(void)asyDownLoadFontWithFontName:(NSString *)fontName
                       downloading:(DownloadingBlock)loadingCallBack
                   downloadSuccess:(DownloadSuccessBlock)sucessCallBack
                     downloadError:(DownloadErrocBlock)errorCalBack {

    //1、准备参数

    //用字体的PostScript名字创建一个NSDicitonary
    NSMutableDictionary *attrs = [NSMutableDictionary dictionaryWithObjectsAndKeys:fontName, kCTFontNameAttribute,nil];
    //创建一个字体描述对象 CTFontDescriptorRef
    CTFontDescriptorRef desc = CTFontDescriptorCreateWithAttributes((__bridge CFDictionaryRef)attrs);
    //将字体描述对象放到一个NSMutableArray中
    NSMutableArray *descs = [NSMutableArray arrayWithCapacity:0];
    [descs addObject:(__bridge id)desc];
    CFRelease(desc);

    //2、开始下载
    CTFontDescriptorMatchFontDescriptorsWithProgressHandler((__bridge CFArrayRef)descs, NULL, ^bool(CTFontDescriptorMatchingState state, CFDictionaryRef  _Nonnull progressParameter) {

        __block BOOL errorDuringDownload = NO;

        double progressValue = [[(__bridge NSDictionary *)progressParameter objectForKey:(id)kCTFontDescriptorMatchingPercentage] doubleValue];
        if (state == kCTFontDescriptorMatchingDidBegin) {
            //字体已经匹配
            NSLog(@"字体已经匹配");
        }else if (state == kCTFontDescriptorMatchingDidFinish) {
            if (!errorDuringDownload) {
                //字体下载完成
                NSLog(@"字体下载完成 -");
                dispatch_async(dispatch_get_main_queue(), ^{
                    if (sucessCallBack) {
                        sucessCallBack();
                    }
                });
            }
        }else if (state == kCTFontDescriptorMatchingWillBeginDownloading) {
            //字体开始下载
        }else if (state == kCTFontDescriptorMatchingDidFinishDownloading) {
            //字体下载完成  (可以在这里修改UI)
            NSLog(@"字体下载完成  (可以在这里修改UI");
            dispatch_async(dispatch_get_main_queue(), ^{
                if (sucessCallBack) {
                    sucessCallBack();
                }
            });
        }else if (state == kCTFontDescriptorMatchingDownloading) {
            //下载中
            NSLog(@"下载中");
            dispatch_async(dispatch_get_main_queue(), ^{
                if (loadingCallBack) {
                    loadingCallBack(progressValue);
                }
            });
        }else if (state == kCTFontDescriptorMatchingDidFailWithError) {
            NSString *errorMsg;
            NSError *error = [(__bridge NSDictionary *)progressParameter objectForKey:(id)kCTFontDescriptorMatchingError];
            if (!error) {
                errorMsg = [errorMsg description];
            }else {
                errorMsg = @"Error Message Is Not Available!";
            }
            dispatch_async(dispatch_get_main_queue(), ^{
                if (errorCalBack) {
                    errorCalBack(errorMsg);
                }
            });
            NSLog(@"errorMsg=%@",errorMsg);
            //设置标志
            errorDuringDownload = YES;
        }
        return YES;
    });
}

@end

下面就是具体的使用:

#import "DynamicViewController.h"
#import "AsyDownloadSystemFont.h"
#import "UIView+FrameHelp.h"

static NSArray *kFontNames() {
    NSArray *fontNames = nil;
    if (!fontNames) {
        fontNames = @[
                      @"STXingkai-SC-Light",
                      @"DFWaWaSC-W5",
                      @"FZLTXHK--GBK1-0",
                      @"STLibian-SC-Regular",
                      @"LiHeiPro",
                      @"HiraginoSansGB-W3"
                      ];
    }
    return fontNames;
}

static NSArray *kFontSamples() {
    NSArray *fontSamples = nil;
    if (!fontSamples) {
        fontSamples = @[
                        @"汉体书写信息技术标准相",
                        @"容档案下载使用界面简单",
                        @"支援服务升级资讯专业制",
                        @"作创意空间快速无线上网",
                        @"兙兛兞兝兡兣嗧瓩糎",
                        @"㈠㈡㈢㈣㈤㈥㈦㈧㈨㈩"
                        ];
    }
    return fontSamples;
}

@interface DynamicViewController () <UITableViewDataSource,UITableViewDelegate>

{
    NSString *_fontName;
}

@property (nonatomic, retain) UITableView *kTableView;
@property (nonatomic, retain) UIProgressView *kProgress;
@property (nonatomic, retain) UITextView     *kTextView;
@property (nonatomic, retain) UIActivityIndicatorView *kActivityView;

@end

@implementation DynamicViewController

#pragma mark - Life Cycle

- (void)viewDidLoad {
    [super viewDidLoad];
    [self uiConfig];
}

#pragma mark - UITableViewDataSource

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [kFontNames() count];
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSArray *fontName = kFontNames();
    static NSString *cellId = @"cellId";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
    if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellId];
    }
    cell.textLabel.text = [fontName objectAtIndex:indexPath.row];
    return cell;
}

#pragma mark - UITableViewDelegate

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    _fontName = [kFontNames() objectAtIndex:indexPath.row];
    BOOL isExist = [AsyDownloadSystemFont isExistWithFontName:_fontName];
    if (isExist) {
        NSString *text = [kFontSamples() objectAtIndex:indexPath.row];
        [self refrshTextViewWithText:text];
    }else {
        NSString *samples = [kFontSamples() objectAtIndex:indexPath.row];
        [AsyDownloadSystemFont asyDownLoadFontWithFontName:_fontName downloading:^(CGFloat progressValue) {
            [self.kProgress setHidden:NO];
            self.kProgress.progress = progressValue/100;
            [self.kActivityView startAnimating];
        } downloadSuccess:^{
            [self.kProgress setHidden:YES];
            [self.kActivityView stopAnimating];
            [self refrshTextViewWithText:samples];
        } downloadError:^(NSString *errorMsg) {
            [self.kProgress setHidden:YES];
            [self.kActivityView stopAnimating];
            NSLog(@"errorMsg=%@",errorMsg);
        }];
    }
}

-(void)refrshTextViewWithText:(NSString *)text {
    self.kTextView.font = [UIFont fontWithName:_fontName size:14.];
    self.kTextView.text = text;
}

#pragma mark - Private Methods

-(void)uiConfig {
    self.view.backgroundColor = [UIColor whiteColor];

    self.kTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, self.view.width, 400) style:UITableViewStylePlain];
    self.kTableView.tableFooterView = [UIView new];
    self.kTableView.dataSource = self;
    self.kTableView.delegate = self;

    self.kProgress = [[UIProgressView alloc] initWithFrame:CGRectMake((self.view.width-150)/2, self.view.height-100, 150, 10)];
    self.kProgress.userInteractionEnabled = NO;
    [self.kProgress setHidden:YES];

    self.kTextView = [[UITextView alloc] initWithFrame:CGRectMake((self.view.width-150)/2, self.view.height-150, 150, 30)];

    self.kActivityView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    self.kActivityView.hidesWhenStopped = YES;

    [self.view addSubview:self.kTableView];
    [self.view addSubview:self.kProgress];
    [self.view addSubview:self.kTextView];
    self.navigationItem.titleView = self.kActivityView;
}

@end
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值