DownloadFont/ViewController.m
/*  | 
File: ViewController.m  | 
Abstract: Demonstrates how to download fonts on demand.  | 
Version: 1.0  | 
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple  | 
 Inc. ("Apple") in consideration of your agreement to the following | 
terms, and your use, installation, modification or redistribution of  | 
this Apple software constitutes acceptance of these terms. If you do  | 
not agree with these terms, please do not use, install, modify or  | 
redistribute this Apple software.  | 
In consideration of your agreement to abide by the following terms, and  | 
subject to these terms, Apple grants you a personal, non-exclusive  | 
license, under Apple's copyrights in this original Apple software (the  | 
"Apple Software"), to use, reproduce, modify and redistribute the Apple  | 
Software, with or without modifications, in source and/or binary forms;  | 
provided that if you redistribute the Apple Software in its entirety and  | 
without modifications, you must retain this notice and the following  | 
text and disclaimers in all such redistributions of the Apple Software.  | 
Neither the name, trademarks, service marks or logos of Apple Inc. may  | 
be used to endorse or promote products derived from the Apple Software  | 
without specific prior written permission from Apple. Except as  | 
expressly stated in this notice, no other rights or licenses, express or  | 
implied, are granted by Apple herein, including but not limited to any  | 
patent rights that may be infringed by your derivative works or by other  | 
works in which the Apple Software may be incorporated.  | 
The Apple Software is provided by Apple on an "AS IS" basis. APPLE  | 
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION  | 
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS  | 
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND  | 
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.  | 
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL  | 
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF  | 
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS  | 
INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION,  | 
MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED  | 
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),  | 
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE  | 
POSSIBILITY OF SUCH DAMAGE.  | 
Copyright (C) 2013 Apple Inc. All Rights Reserved.  | 
*/  | 
#import "ViewController.h"  | 
#import <CoreText/CoreText.h>  | 
@interface ViewController ()  | 
@property (strong, nonatomic) NSString *errorMessage;  | 
@end  | 
@implementation ViewController  | 
- (void)asynchronouslySetFontName:(NSString *)fontName  | 
{ | 
UIFont* aFont = [UIFont fontWithName:fontName size:12.];  | 
// If the font is already downloaded  | 
    if (aFont && ([aFont.fontName compare:fontName] == NSOrderedSame || [aFont.familyName compare:fontName] == NSOrderedSame)) { | 
// Go ahead and display the sample text.  | 
NSUInteger sampleIndex = [_fontNames indexOfObject:fontName];  | 
_fTextView.text = [_fontSamples objectAtIndex:sampleIndex];  | 
_fTextView.font = [UIFont fontWithName:fontName size:24.];  | 
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;  | 
// Start processing the font descriptor..  | 
// This function returns immediately, but can potentially take long time to process.  | 
// The progress is notified via the callback block of CTFontDescriptorProgressHandler type.  | 
// See CTFontDescriptor.h for the list of progress states and keys for progressParameter dictionary.  | 
    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(), ^ { | 
// Show an activity indicator  | 
[_fActivityIndicatorView startAnimating];  | 
_fActivityIndicatorView.hidden = NO;  | 
// Show something in the text view to indicate that we are downloading  | 
_fTextView.text= [NSString stringWithFormat:@"Downloading %@", fontName];  | 
_fTextView.font = [UIFont systemFontOfSize:14.];  | 
NSLog(@"Begin Matching");  | 
});  | 
        } else if (state == kCTFontDescriptorMatchingDidFinish) { | 
            dispatch_async( dispatch_get_main_queue(), ^ { | 
// Remove the activity indicator  | 
[_fActivityIndicatorView stopAnimating];  | 
_fActivityIndicatorView.hidden = YES;  | 
// Display the sample text for the newly downloaded font  | 
NSUInteger sampleIndex = [_fontNames indexOfObject:fontName];  | 
_fTextView.text = [_fontSamples objectAtIndex:sampleIndex];  | 
_fTextView.font = [UIFont fontWithName:fontName size:24.];  | 
// 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(@"%@ downloaded", fontName);  | 
}  | 
});  | 
        } else if (state == kCTFontDescriptorMatchingWillBeginDownloading) { | 
            dispatch_async( dispatch_get_main_queue(), ^ { | 
// Show a progress bar  | 
_fProgressView.progress = 0.0;  | 
_fProgressView.hidden = NO;  | 
NSLog(@"Begin Downloading");  | 
});  | 
        } else if (state == kCTFontDescriptorMatchingDidFinishDownloading) { | 
            dispatch_async( dispatch_get_main_queue(), ^ { | 
// Remove the progress bar  | 
_fProgressView.hidden = YES;  | 
NSLog(@"Finish downloading");  | 
});  | 
        } else if (state == kCTFontDescriptorMatchingDownloading) { | 
            dispatch_async( dispatch_get_main_queue(), ^ { | 
// Use the progress bar to indicate the progress of the downloading  | 
[_fProgressView setProgress:progressValue / 100.0 animated:YES];  | 
NSLog(@"Downloading %.0f%% complete", progressValue);  | 
});  | 
        } else if (state == kCTFontDescriptorMatchingDidFailWithError) { | 
// An error has occurred.  | 
// Get the error message  | 
NSError *error = [(__bridge NSDictionary *)progressParameter objectForKey:(id)kCTFontDescriptorMatchingError];  | 
            if (error != nil) { | 
_errorMessage = [error description];  | 
            } else { | 
_errorMessage = @"ERROR MESSAGE IS NOT AVAILABLE!";  | 
}  | 
// Set our flag  | 
errorDuringDownload = YES;  | 
            dispatch_async( dispatch_get_main_queue(), ^ { | 
_fProgressView.hidden = YES;  | 
NSLog(@"Download error: %@", _errorMessage);  | 
});  | 
}  | 
return (bool)YES;  | 
});  | 
}  | 
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section  | 
{ | 
return [_fontNames count];  | 
}  | 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath  | 
{    | 
static NSString *MyIdentifier = @"MyIdentifier";  | 
// Try to retrieve from the table view a now-unused cell with the given identifier.  | 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];  | 
// If no cell is available, create a new one using the given identifier.  | 
    if (cell == nil) { | 
// Use the default cell style.  | 
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier];  | 
}  | 
// Set up the cell.  | 
cell.textLabel.text = _fontNames[indexPath.row];  | 
return cell;  | 
}  | 
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath  | 
{ | 
[self asynchronouslySetFontName:_fontNames[indexPath.row]];  | 
// Dismiss the keyboard in the text view if it is currently displayed  | 
if ([self.fTextView isFirstResponder])  | 
[self.fTextView resignFirstResponder];  | 
}  | 
- (void)viewDidLoad  | 
{ | 
[super viewDidLoad];  | 
self.fontNames = [[NSArray alloc] initWithObjects:  | 
@"STXingkai-SC-Light",  | 
@"DFWaWaSC-W5",  | 
@"FZLTXHK--GBK1-0",  | 
@"STLibian-SC-Regular",  | 
@"LiHeiPro",  | 
@"HiraginoSansGB-W3",  | 
nil];  | 
self.fontSamples = [[NSArray alloc] initWithObjects:  | 
@"汉体书写信息技术标准相",  | 
@"容档案下载使用界面简单",  | 
@"支援服务升级资讯专业制",  | 
@"作创意空间快速无线上网",  | 
@"兙兛兞兝兡兣嗧瓩糎",  | 
@"㈠㈡㈢㈣㈤㈥㈦㈧㈨㈩",  | 
nil];  | 
}  | 
- (void)didReceiveMemoryWarning  | 
{ | 
[super didReceiveMemoryWarning];  | 
// Dispose of any resources that can be recreated.  | 
}  | 
@end  | 
Copyright © 2013 Apple Inc. All Rights Reserved. Terms of Use | Privacy Policy | Updated: 2013-06-07