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