您所在的位置:小祥子 » 编程 » IOS » 正文

UIFont-动态下载系统提供的字体-官方代码

时间:2015-07-31 编辑:Livia-Chen 来源:Cnblogs

一,工程目录

二,AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    
    
    ViewController *view=[[ViewController alloc]init];
    UINavigationController *nav=[[UINavigationController alloc]initWithRootViewController:view];
    self.window.backgroundColor=[UIColor whiteColor];
    self.window.rootViewController=nav;
    
    
    
    return YES;
}

三,ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
<UITableViewDelegate,UITableViewDataSource>
{
    UITableView *myTableView;
    NSArray *fontNames;
    NSArray *fontSamples;
}


@end

四, ViewController.m

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

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    //初始化数据
    [self addData];
    //初始化界面
    [self addView];
    
}
#pragma -mark -functions
//初始化界面
-(void)addView
{
    myTableView=[[UITableView alloc]initWithFrame:CGRectMake(0, 100, 320, 200)];
    myTableView.delegate=self;
    myTableView.dataSource=self;
    [self.view addSubview:myTableView];

}
//初始化数据
-(void)addData
{
    fontNames = [[NSArray alloc] initWithObjects:
                 @"STXingkai-SC-Light",
                 @"DFWaWaSC-W5",
                 @"FZLTXHK--GBK1-0",
                 @"STLibian-SC-Regular",
                 @"LiHeiPro",
                 @"HiraginoSansGB-W3",
                 nil];
    fontSamples = [[NSArray alloc] initWithObjects:
                   @"汉体书写信息技术标准相",
                   @"容档案下载使用界面简单",
                   @"支援服务升级资讯专业制",
                   @"作创意空间快速无线上网",
                   @"兙兛兞兝兡兣嗧瓩糎",
                   @"㈠㈡㈢㈣㈤㈥㈦㈧㈨㈩",
                   nil];

}
#pragma -mark -UITableViewDelegate
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [fontNames count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *MyIdentifier = @"MyIdentifier";
    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier];
    }
    cell.textLabel.text = fontNames[indexPath.row];
    
    return cell;
}


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self asynchronouslySetFontName:fontNames[indexPath.row]];
}
#pragma -mark -functions
//字体开始进行下载
- (void)asynchronouslySetFontName:(NSString *)fontName
{
    UIFont* aFont = [UIFont fontWithName:fontName size:12.];
    //判断字体是否已经被下载
    if (aFont && ([aFont.fontName compare:fontName] == NSOrderedSame || [aFont.familyName compare:fontName] == NSOrderedSame)) {
        NSLog(@"字体已经被下载");
        return;
    }
    
    //用字体的PostScript名字创建一个Dictionary
    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);
    
    __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) {
            dispatch_async( dispatch_get_main_queue(), ^ {
                NSLog(@"字体已经匹配");
                });
        } else if (state == kCTFontDescriptorMatchingDidFinish) {
            dispatch_async( dispatch_get_main_queue(), ^ {
                NSLog(@"字体下载完成");
                      // Log the font URL in the console
                CTFontRef fontRef = CTFontCreateWithName((__bridge CFStringRef)fontName, 0., NULL);
                CFStringRef fontURL = CTFontCopyAttribute(fontRef, kCTFontURLAttribute);
                CFRelease(fontURL);
                CFRelease(fontRef);
                
                if (!errorDuringDownload) {
                    NSLog(@"%@ downloaded", fontName);
                }
            });
        } else if (state == kCTFontDescriptorMatchingWillBeginDownloading) {
            dispatch_async( dispatch_get_main_queue(), ^ {
                NSLog(@"字体开始下载");
            });
        } else if (state == kCTFontDescriptorMatchingDidFinishDownloading) {
            dispatch_async( dispatch_get_main_queue(), ^ {
                NSLog(@"字体下载完成");
                });
        } else if (state == kCTFontDescriptorMatchingDownloading) {
            dispatch_async( dispatch_get_main_queue(), ^ {
                NSLog(@"下载进度");
            });
        } else if (state == kCTFontDescriptorMatchingDidFailWithError) {
            NSLog(@"下载失败");
            
            NSError *error = [(__bridge NSDictionary *)progressParameter objectForKey:(id)kCTFontDescriptorMatchingError];
            if (error != nil) {
                NSLog(@"errorMessage--%@-",[error description]);
            } else {
                NSLog(@"error message is not available");
            }
            errorDuringDownload = YES;
            dispatch_async( dispatch_get_main_queue(), ^ {
                NSLog(@"Download error: %@", [error description]);
            });
        }
        
        return (bool)YES;
    });
    
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

参考资料:《iOS开发进阶》 -唐巧