using fonts with text kit - apple inc. · quo usque tandem abutere, catilina, patientia nostra? quo...

61
These are confidential sessions—please refrain from streaming, blogging, or taking pictures Session 223 Using Fonts with Text Kit Ned Holbrook Typographic Engineer

Upload: others

Post on 09-Mar-2020

10 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

These are confidential sessions—please refrain from streaming, blogging, or taking pictures

Session 223

Using Fonts with Text Kit

Ned HolbrookTypographic Engineer

Page 2: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

What You’ll Learn

• Specifying fonts■ Dynamic Type■ Font descriptors■ Adding fonts

• Language tagging• Modifying fallbacks

Page 3: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

Text Kit WebKit

SynopsisWhat Is Text Kit?

Core Text

CoreGraphics

Page 4: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

Text Kit WebKit• Text Kit and Web Kit are built on Core Text

SynopsisWhat Is Text Kit?

Text Kit WebKit

Core Text

CoreGraphics

Page 5: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

Text Kit WebKit• Text Kit and Web Kit are built on Core Text

• Core Text is available for specialized tasks

SynopsisWhat Is Text Kit?

Text Kit WebKit

Core Text

CoreGraphics

Core Text

Page 6: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

Text Kit WebKit• Text Kit and Web Kit are built on Core Text

• Core Text is available for specialized tasks

• Unicode text layout■ String + Font = Glyphs

SynopsisWhat Is Text Kit?

Text Kit WebKit

Core Text

CoreGraphics

Core Text

Page 7: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

Specifying Fonts

Page 8: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

Which Font?

• Dynamic Type• System font• UIFontDescriptor• Adding fonts

Page 9: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

Dynamic Type

Page 10: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

Dynamic Type

Page 11: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

Dynamic Type

• Organized by usage• Optimized for legibility• User picks size

■ Auto Layout

Page 12: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

Text StylesSubhead comparison

Quo usque tandem abutere, Catilina, patientia nostra?

Quo usque tandem abutere,Catilina, patientia nostra?

Quo usque tandem abutere,Catilina, patientia nostra?

Quo usque tandem abutere,Catilina, patientia nostra?

Quo usque tandem abutere,Catilina, patientia nostra?

Quo usque tandem abutere,Catilina, patientia nostra?

Quo usque tandem abutere,Catilina, patientia nostra?

Page 13: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

Text StylesSubhead comparison

Quo usque tandem abutere,Catilina, patientia nostra?

Quo usque tandem abutere,Catilina, patientia nostra?

Page 14: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

Using Text Styles

+[UIFont preferredFontForTextStyle:]■ Styles in UIFontDescriptor documentation

• Can be modified with symbolic traits• CSS properties

■ Prefixed with -apple-system-

Page 15: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

System Fonts

• “Meta” fonts■ May change across releases (e.g., Lucida Grande)■ Hidden names start with ‘.’ (period)

• +[UIFont systemFontOfSize:] and friends■ Not for user content■ Only recompiled code will get new font on iOS 7

Page 16: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

UIFontDescriptor

• Describes a font• Access and modify font properties• List available fonts• Specify your own fonts

Page 17: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

Descriptor Basics

• Font attributes■ Names, size, traits, features, etc.

• Described font may not exist• Describe an actual font by matching on attributes

Page 18: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

Descriptor Matching

• Explicit matching-[UIFontDescriptor matchingFontDescriptorsWithMandatoryKeys:]

• Implicit matching-[UIFontDescriptor fontDescriptorWithSymbolicTraits:]-[UIFont fontWithDescriptor:size:]

Page 19: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

Family name matchingDescriptor Matching

UIFontDescriptor *helveticaNeueFamily = [UIFontDescriptor fontDescriptorWithFontAttributes: @{ UIFontDescriptorFamilyAttribute: @"Helvetica Neue" }];

NSArray *matches = [helveticaNeueFamily matchingFontDescriptorsWithMandatoryKeys: nil];

Page 20: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

Family name matchingDescriptor Matching

UIFontDescriptor *helveticaNeueFamily = [UIFontDescriptor fontDescriptorWithFontAttributes: @{ UIFontDescriptorFamilyAttribute: @"Helvetica Neue" }];

NSArray *matches = [helveticaNeueFamily matchingFontDescriptorsWithMandatoryKeys: nil];

Page 21: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

Family name matchingDescriptor Matching

UIFontDescriptor *helveticaNeueFamily = [UIFontDescriptor fontDescriptorWithFontAttributes: @{ UIFontDescriptorFamilyAttribute: @"Helvetica Neue" }];

NSArray *matches = [helveticaNeueFamily matchingFontDescriptorsWithMandatoryKeys: nil];

Page 22: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

Family name matchingDescriptor Matching

UIFontDescriptor *helveticaNeueFamily = [UIFontDescriptor fontDescriptorWithFontAttributes: @{ UIFontDescriptorFamilyAttribute: @"Helvetica Neue" }];

NSArray *matches = [helveticaNeueFamily matchingFontDescriptorsWithMandatoryKeys: nil];

HelveticaNeueHelveticaNeue-MediumHelveticaNeue-LightHelveticaNeue-Thin…

Page 23: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

Family name matchingDescriptor Matching

UIFontDescriptor *helveticaNeueFamily = [UIFontDescriptor fontDescriptorWithFontAttributes: @{ UIFontDescriptorFamilyAttribute: @"Helvetica Neue" }];

NSArray *matches = [helveticaNeueFamily matchingFontDescriptorsWithMandatoryKeys: nil];

Page 24: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

Text style emboldeningDescriptor Matching

UIFontDescriptor *fontDescriptor = [UIFontDescriptor preferredFontDescriptorWithTextStyle: UIFontTextStyleBody];

UIFontDescriptor *boldFontDescriptor = [fontDescriptor fontDescriptorWithSymbolicTraits: UIFontDescriptorTraitBold];

UIFont *boldFont = [UIFont fontWithDescriptor: boldFontDescriptor size: 0.0];

Page 25: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

Text style emboldeningDescriptor Matching

UIFontDescriptor *fontDescriptor = [UIFontDescriptor preferredFontDescriptorWithTextStyle: UIFontTextStyleBody];

UIFontDescriptor *boldFontDescriptor = [fontDescriptor fontDescriptorWithSymbolicTraits: UIFontDescriptorTraitBold];

UIFont *boldFont = [UIFont fontWithDescriptor: boldFontDescriptor size: 0.0];

Page 26: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

Text style emboldeningDescriptor Matching

UIFontDescriptor *fontDescriptor = [UIFontDescriptor preferredFontDescriptorWithTextStyle: UIFontTextStyleBody];

UIFontDescriptor *boldFontDescriptor = [fontDescriptor fontDescriptorWithSymbolicTraits: UIFontDescriptorTraitBold];

UIFont *boldFont = [UIFont fontWithDescriptor: boldFontDescriptor size: 0.0];

Page 27: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

Text style emboldeningDescriptor Matching

UIFontDescriptor *fontDescriptor = [UIFontDescriptor preferredFontDescriptorWithTextStyle: UIFontTextStyleBody];

UIFontDescriptor *boldFontDescriptor = [fontDescriptor fontDescriptorWithSymbolicTraits: UIFontDescriptorTraitBold];

UIFont *boldFont = [UIFont fontWithDescriptor: boldFontDescriptor size: 0.0];

Page 28: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

Text style emboldeningDescriptor Matching

UIFontDescriptor *fontDescriptor = [UIFontDescriptor preferredFontDescriptorWithTextStyle: UIFontTextStyleBody];

UIFontDescriptor *boldFontDescriptor = [fontDescriptor fontDescriptorWithSymbolicTraits: UIFontDescriptorTraitBold];

UIFont *boldFont = [UIFont fontWithDescriptor: boldFontDescriptor size: 0.0];

Page 29: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

Descriptor Serialization

• NSCoding protocol• Manual serialization-[UIFontDescriptor fontAttributes]

Page 30: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

Modifying a Font Instance

• Activate typographic featuresUIFontDescriptorFeatureSettingsAttribute

• Remove unwanted charactersUIFontDescriptorCharacterSetAttribute

Page 31: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

Modifying a Font InstanceTime appearance

11:15vs.

11:15

Page 32: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

Time appearanceModifying a Font Instance

NSArray *timeFeatureSettings = @[ @{ UIFontFeatureTypeIdentifierKey: @(kNumberSpacingType), UIFontFeatureSelectorIdentifierKey: @(kProportionalNumbersSelector) }, @{ UIFontFeatureTypeIdentifierKey: @(kCharacterAlternativesType), UIFontFeatureSelectorIdentifierKey: @(1) }];

UIFont *font = …;UIFontDescriptor *originalDescriptor = [font fontDescriptor];UIFontDescriptor *timeDescriptor = [originalDescriptor fontDescriptorByAddingAttributes: @{ UIFontDescriptorFeatureSettingsAttribute: timeFeatureSettings }];UIFont *timeFont = [UIFont fontWithDescriptor: timeDescriptor size: 0.0];

Page 33: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

Time appearanceModifying a Font Instance

NSArray *timeFeatureSettings = @[ @{ UIFontFeatureTypeIdentifierKey: @(kNumberSpacingType), UIFontFeatureSelectorIdentifierKey: @(kProportionalNumbersSelector) }, @{ UIFontFeatureTypeIdentifierKey: @(kCharacterAlternativesType), UIFontFeatureSelectorIdentifierKey: @(1) }];

UIFont *font = …;UIFontDescriptor *originalDescriptor = [font fontDescriptor];UIFontDescriptor *timeDescriptor = [originalDescriptor fontDescriptorByAddingAttributes: @{ UIFontDescriptorFeatureSettingsAttribute: timeFeatureSettings }];UIFont *timeFont = [UIFont fontWithDescriptor: timeDescriptor size: 0.0];

Page 34: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

Time appearanceModifying a Font Instance

NSArray *timeFeatureSettings = @[ @{ UIFontFeatureTypeIdentifierKey: @(kNumberSpacingType), UIFontFeatureSelectorIdentifierKey: @(kProportionalNumbersSelector) }, @{ UIFontFeatureTypeIdentifierKey: @(kCharacterAlternativesType), UIFontFeatureSelectorIdentifierKey: @(1) }];

UIFont *font = …;UIFontDescriptor *originalDescriptor = [font fontDescriptor];UIFontDescriptor *timeDescriptor = [originalDescriptor fontDescriptorByAddingAttributes: @{ UIFontDescriptorFeatureSettingsAttribute: timeFeatureSettings }];UIFont *timeFont = [UIFont fontWithDescriptor: timeDescriptor size: 0.0];

Page 35: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

Time appearanceModifying a Font Instance

NSArray *timeFeatureSettings = @[ @{ UIFontFeatureTypeIdentifierKey: @(kNumberSpacingType), UIFontFeatureSelectorIdentifierKey: @(kProportionalNumbersSelector) }, @{ UIFontFeatureTypeIdentifierKey: @(kCharacterAlternativesType), UIFontFeatureSelectorIdentifierKey: @(1) }];

UIFont *font = …;UIFontDescriptor *originalDescriptor = [font fontDescriptor];UIFontDescriptor *timeDescriptor = [originalDescriptor fontDescriptorByAddingAttributes: @{ UIFontDescriptorFeatureSettingsAttribute: timeFeatureSettings }];UIFont *timeFont = [UIFont fontWithDescriptor: timeDescriptor size: 0.0];

Page 36: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

Overly happy snowmanModifying a Font Instance

This ☃ isn’t my favorite

This ☃ is more sedate

vs.

Page 37: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

Overly happy snowmanModifying a Font Instance

UIFont *font = …;UIFontDescriptor *originalDescriptor = [font fontDescriptor];NSMutableCharacterSet *cset = [[originalDescriptor objectForKey: UIFontDescriptorCharacterSetAttribute] mutableCopy];[cset removeCharactersInRange: NSMakeRange(0x2603, 1)];

UIFontDescriptor *snowmanRemoved = [originalDescriptor fontDescriptorByAddingAttributes: @{ UIFontDescriptorCharacterSetAttribute: cset }];font = [UIFont fontWithDescriptor: snowmanRemoved size: 0.0];

Page 38: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

Overly happy snowmanModifying a Font Instance

UIFont *font = …;UIFontDescriptor *originalDescriptor = [font fontDescriptor];NSMutableCharacterSet *cset = [[originalDescriptor objectForKey: UIFontDescriptorCharacterSetAttribute] mutableCopy];[cset removeCharactersInRange: NSMakeRange(0x2603, 1)];

UIFontDescriptor *snowmanRemoved = [originalDescriptor fontDescriptorByAddingAttributes: @{ UIFontDescriptorCharacterSetAttribute: cset }];font = [UIFont fontWithDescriptor: snowmanRemoved size: 0.0];

Page 39: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

Overly happy snowmanModifying a Font Instance

UIFont *font = …;UIFontDescriptor *originalDescriptor = [font fontDescriptor];NSMutableCharacterSet *cset = [[originalDescriptor objectForKey: UIFontDescriptorCharacterSetAttribute] mutableCopy];[cset removeCharactersInRange: NSMakeRange(0x2603, 1)];

UIFontDescriptor *snowmanRemoved = [originalDescriptor fontDescriptorByAddingAttributes: @{ UIFontDescriptorCharacterSetAttribute: cset }];font = [UIFont fontWithDescriptor: snowmanRemoved size: 0.0];

Page 40: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

Overly happy snowmanModifying a Font Instance

UIFont *font = …;UIFontDescriptor *originalDescriptor = [font fontDescriptor];NSMutableCharacterSet *cset = [[originalDescriptor objectForKey: UIFontDescriptorCharacterSetAttribute] mutableCopy];[cset removeCharactersInRange: NSMakeRange(0x2603, 1)];

UIFontDescriptor *snowmanRemoved = [originalDescriptor fontDescriptorByAddingAttributes: @{ UIFontDescriptorCharacterSetAttribute: cset }];font = [UIFont fontWithDescriptor: snowmanRemoved size: 0.0];

Page 41: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

BYOFAdding Fonts

• Containers■ TTF, TTC■ OTF, OTC

• Formats■ Apple Advanced Typography (AAT)

■ iOS: ‘morx’ only (no ‘mort’)■ OpenType

■ Complex scripts (pre-Vista Indic)

Page 42: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

Adding Fonts

• Include in app bundle■ Automatically added using UIAppFonts Info.plist key

• Manually add■ Registered or unregistered

Page 43: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

RegisteredAdding Fonts

• Referenced by name—same as with installed fontsCTFontManagerRegisterFontsForURL()CTFontManagerRegisterFontsForURLs()CTFontManagerRegisterGraphicsFont()

Page 44: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

UnregisteredAdding Fonts

• Referenced by descriptor—use it or lose it■ Cannot be matched by name

CTFontManagerCreateFontDescriptorsFromURL()CTFontManagerCreateFontDescriptorFromData()

Page 45: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

Extra Credit

• Downloadable fonts■ All OS X fonts■ Additional international fonts

CTFontDescriptorCreateMatchingFontDescriptorsWithProgressHandler() + kCTFontDownloadableAttribute

• ProfileskCTFontManagerRegisteredFontsChangedNotification

Page 46: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

Language Tagging

Page 47: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

kCTLanguageAttributeName

• Override system language for localized behaviors■ Glyph substitution■ Line breaking■ Font fallbacks

Page 48: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

[[NSAttributedString alloc] initWithString: @"\u015F\u0163" attributes: @{ NSFontAttributeName: @"Verdana", (id)kCTLanguageAttributeName:

}];

Glyph substitutionkCTLanguageAttributeName

@"ro"

șț

@"en"

şţ

Page 49: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

[[NSAttributedString alloc] initWithString: @"…" attributes: @{ (id)kCTLanguageAttributeName:

}];

Line breakingkCTLanguageAttributeName

@"en"ビジネスを実行するオンラインアプリケーション

@"ja"ビジネスを実行するオンラインアプリケーション

Page 50: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

[[NSAttributedString alloc] initWithString: @"\u5203" attributes: @{ (id)kCTLanguageAttributeName:

}];

Font fallbackskCTLanguageAttributeName

@"ja"

刃@"zh-Hans"

Page 51: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

Modifying Fallbacks

Page 52: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

Custom Cascade List

• UIFontDescriptorCascadeListAttribute• Inserted before standard fallbacks

Page 53: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

Specifying an Arabic fallback fontCustom Cascade List

apple: التّفّاحة

apple: التّفّاحةvs.

Page 54: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

Specifying an Arabic fallback fontCustom Cascade List

UIFontDescriptor *arabic = …;NSArray *cascadeList = @[ arabic ];

UIFont *font = …;UIFontDescriptor *originalDescriptor = [font fontDescriptor];UIFontDescriptor *cascadeListAdded = [originalDescriptor fontDescriptorByAddingAttributes: @{ UIFontDescriptorCascadeListAttribute: cascadeList }];font = [UIFont fontWithDescriptor: cascadeListAdded size: 0.0];

Page 55: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

Specifying an Arabic fallback fontCustom Cascade List

UIFontDescriptor *arabic = …;NSArray *cascadeList = @[ arabic ];

UIFont *font = …;UIFontDescriptor *originalDescriptor = [font fontDescriptor];UIFontDescriptor *cascadeListAdded = [originalDescriptor fontDescriptorByAddingAttributes: @{ UIFontDescriptorCascadeListAttribute: cascadeList }];font = [UIFont fontWithDescriptor: cascadeListAdded size: 0.0];

Page 56: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

Specifying an Arabic fallback fontCustom Cascade List

UIFontDescriptor *arabic = …;NSArray *cascadeList = @[ arabic ];

UIFont *font = …;UIFontDescriptor *originalDescriptor = [font fontDescriptor];UIFontDescriptor *cascadeListAdded = [originalDescriptor fontDescriptorByAddingAttributes: @{ UIFontDescriptorCascadeListAttribute: cascadeList }];font = [UIFont fontWithDescriptor: cascadeListAdded size: 0.0];

Page 57: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

Specifying an Arabic fallback fontCustom Cascade List

UIFontDescriptor *arabic = …;NSArray *cascadeList = @[ arabic ];

UIFont *font = …;UIFontDescriptor *originalDescriptor = [font fontDescriptor];UIFontDescriptor *cascadeListAdded = [originalDescriptor fontDescriptorByAddingAttributes: @{ UIFontDescriptorCascadeListAttribute: cascadeList }];font = [UIFont fontWithDescriptor: cascadeListAdded size: 0.0];

Page 58: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

More Information

Jake BehrensApp Frameworks [email protected]

Documentationhttp://developer.apple.com

Apple Developer Forumshttp://devforums.apple.com

Page 59: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

Related Sessions

Introduction to Text Kit PresidioWednesday 2:00PM

Advanced Text Layouts and Effects with Text Kit MissionThursday 2:00PM

Page 60: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,

Summary

• Text styles on iOS 7■ Use Auto Layout or otherwise adapt to font and size changes

• Language tagging■ Override system language for known content

• Modifying fallbacks■ Insert descriptors prior to default fallbacks

Page 61: Using Fonts with Text Kit - Apple Inc. · Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina, patientia nostra? Quo usque tandem abutere, Catilina,