フォントの生成とカスタマイズ
UIKit徹底解説 iOSユーザーインターフェイスの開発
iPhone/iPadアプリのUI開発テクニックを完全網羅!この記事は、書籍『UIKit徹底解説 iOSユーザーインターフェイスの開発』の内容を、Think IT向けに特別公開しているものです。
テキストコンテンツを扱うアプリはもちろん、そうではないアプリでもテキストのアピアランスは、アプリの印象を大きく変えます。対象とするユーザーや表示コンテンツに応じて適切なフォントを使用したり、テキストを強調して表示するなど、テキストの表現力が増すことでアプリの表現力も高まります。
iOS 7で導入されたText Kitは、多彩なテキスト表現をUIKit上で実現可能にしています。慣れ親しんだUIKitの機能として、テキストアピアランスやレイアウトを改善できることは、開発者にとっての福音です。
テキストの表現で重要なものの1つに、フォントが挙げられます。コンテンツに最適なフォントを採用することはもちろん、iOS 7からの機能である「Dynamic Type」に対応することも重要です。本記事から3回にわたり、フォントの生成からDynamic Type対応までを解説します。今回は、フォントの生成とカスタマイズです。
フォントに関するクラスは2つあります。1つはフォントそのものを表現するUIFontクラス、もう1つはフォント情報を表現するUIFontDescriptorクラスです。
フォントは、UIFontクラスで直接生成することはもちろん、UIFontDescriptorからでも生成できます。UIFontDescriptorを使用すると、フォントカスタマイズが容易になるだけでなく、フォント情報のアーカイブ・アンアーカイブが可能になります。これは、UIFontDescriptorがNSCodingプロトコルを採用しているためです。
なお、UIFontとUIFontDescriptorはtoll-free型オブジェクトです。それぞれ、CTFont、CTFontDescriptorとの間でオブジェクトをキャストしてそのまま利用できます*1。
*1 UIFontとCTFontがtool-free型となっているのは、iOS 7以降です。
フォント生成(UIFontクラス)
UIFontDescriptorを用いずに直接フォントを生成する場合、UIFontのクラスメソッドを利用します(ソースコード1)。下記のfontWithName:size:メソッドで指定するフォント名には、フォントファミリ名とスタイル名が含まれます。
// システムフォントを生成 + (UIFont *)systemFontOfSize:(CGFloat)fontSize; // ボールド体のシステムフォントを生成 + (UIFont *)boldSystemFontOfSize:(CGFloat)fontSize; // イタリック体のシステムフォントを生成 + (UIFont *)italicSystemFontOfSize:(CGFloat)fontSize; // フォント名を指定して生成 + (UIFont *)fontWithName:(NSString *)fontName size:(CGFloat)fontSize;
アプリを実行しているデバイスで利用可能なフォントファミリと、各フォントファミリに対応するフォント名は、以下のクラスメソッドで取得可能です。
// フォントファミリを取得 + (NSArray *)familyNames; // フォント名を取得 + (NSArray *)fontNamesForFamilyName:(NSString *)familyName;
UIFontオブジェクトは、一旦生成すると変更ができません。なお、サイズが異なる同一フォントを得るためには、fontWithSize:メソッドを利用します。
フォント生成(UIFontDescriptorクラス)
UIFontDescriptorを利用したフォントの生成方法を解説します。UIFontDescriptorは、フォントの属性(フォント情報)をまとめて管理するクラスです。UIFontは、UIFontDescriptorが持つ情報を元にフォントを生成できます。
例えば、フォントファミリを属性として持つディスクリプタの生成は下記の通りです(ソースコード3)。ここで属性はNSDictionaryを用いて指定します。さらに、特定の属性を持つディスクリプタを生成するクラスメソッドが用意されているので、これらの利用も可能です。
UIFontDescriptor *helveticaNeueFamily = [UIFontDescriptor fontDescriptorWithFontAttributes: @{UIFontDescriptorFamilyAttribute: @"Helvetica Neue"}];
UIFontDescriptorは、属性を示すfontAttributesプロパティ(NSDictionary)を持ちます。上記ソースコード3で生成したhelveticaNeueFamilyのfontAttributesには、フォントファミリ属性が格納されています(ソースコード4)。
すなわち、キーUIFontFamilyAttributeと値“Helvetica Neue”のみが存在しています。
なお、下記のログ表示結果では、キーが“NSFontFamilyAttribute”となっていますが、これは“UIFontFamilyAttribute”の実際の値です。
NSLog(@"%@", helveticaNeueFamily.fontAttributes); // ログ表示結果 // { // NSFontFamilyAttribute = "Helvetica Neue"; // }
しかし、上記で取得できる属性だけではフォント情報として不十分です。フォントそのものの情報を取得するには、objectForKey:メソッドを利用します。例えば、下記のコードでフォント名を取得できます。
NSString *fontName = [helveticaNeueFamily objectForKey:UIFontDescriptorNameAttribute]; NSLog(@"%@", fontName); // ログ表示結果 // HelveticaNeue
objectForKey:の変数は、属性キー(UIFontDescriptorXxxAttribute)です(属性キーの詳細は本項後半で解説します)。また、フォント名(ポストスクリプト名)、変換行列(アフィン変換)、サイズ、シンボリック特性(UIFontDescriptorSymbolicTraits)は、それぞれプロパティpostscriptName、matrix、pointSize、symbolicTraitsで取得できます。いずれもreadonlyプロパティです。
UIFontDescriptorの特徴として、属性を追加または変更したディスクリプタを簡単に生成できることが挙げられます。例えば、上記のディスクリプタに、フォント特性属性(イタリック体)とサイズ特性(12.0ポイント)を追加するには、以下のコードで利用します。
UIFontDescriptor *helveticaNeueItalic = [helveticaNeueFamily fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitItalic]; helveticaNeueItalic = [helveticaNeueItalic fontDescriptorWithSize:12.0];
なお、上記の例では、属性を2回に分けて追加していますが、fontDescriptorByAddingAttributes:メソッドを用いれば、辞書を利用して同時に複数の属性を追加することも可能です。
UIFontDescriptorからUIFontオブジェクトを生成するには、UIFontのクラスメソッドを利用します。
UIFont *helveticaItalicFont = [UIFont fontWithDescriptor:helveticaNeueFamily size:0.0];
上記で引数sizeに0より大きな値を指定すると、そのサイズのフォントが生成されます。一方、sizeに0を指定すると、ディスクリプタが持つサイズ情報がそのまま利用されます。上記の例では、ディスクリプタが持つ12.0ポイントのフォントが生成されます。
次の記事では、UIFontDescriptorの属性キーとその値を説明します。