Dynamic Typeに対応してユーザー設定に合わせたフォントを使用する
この記事は、書籍『UIKit徹底解説 iOSユーザーインターフェイスの開発』の内容を、Think IT向けに特別公開しているものです。
iOS 7からは、テキストコンテンツを表示する際に、ユーザーが好みの文字サイズを設定できます。これは「Dynamic Type」と呼ばれる機能です。アプリのDynamic Type対応は、ユーザー設定に合わせたフォントを作成し使用することを意味します。今回は、Dynamic Typeへの対応方法を解説します。
テキストスタイル属性を利用したフォントの生成
Dynamic Typeを使う場合、フォント名やサイズの代わりに「テキストスタイル」属性(UIFontDescriptorTextStyleAttribute)を使用してフォントを生成します。テキストスタイルには、以下の6通りが定義されています。これらのテキストスタイルは、表示すべきコンテンツに合わせてアプリ側が指定します。
- UIFontTextStyleHeadline
- UIFontTextStyleSubheadline
- UIFontTextStyleBody
- UIFontTextStyleCaption1
- UIFontTextStyleCaption2
- UIFontTextStyleFootnote
「設定」の[一般]→[文字サイズを変更]では、通常7段階の文字サイズが選択可能です。さらに、[一般]→[アクセシビリティ]で[より大きな文字]をオンにすると追加で5段階、合計12段階の設定が可能となります。
UIFontまたはUIFontDescriptorは、指定されたテキストスタイルと文字サイズ設定の組み合わせから適切なフォントを生成します。開発者は、生成されるフォントがどのようなフォントであるかを意識する必要はありません。
テキストスタイルは、Interface Builder(以降、IB)からでも、コードからでも設定できます。IBを利用する場合は、下記の通り、Attributes Inspectorの[Font]欄で設定したいテキストスタイルを選択します(図5)。
コードで設定する場合、UIFontまたはUIFontDescriptorの生成時にテキストスタイルを指定します。UIFontの生成には、preferredFontForTextStyle:クラスメソッドを利用します(ソースコード17)。
UIFont *headlineFont = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];
同じく、UIFontDescriptorの生成には、preferredFontDescriptorWithTextStyle:クラスメソッドを利用します。直接フォントを生成する代わりにディスクリプタを生成するメリットは、あとから属性を追加できる点です。例えば、テキストスタイルを適用して、イタリック体のフォントを生成するには、2段階に分けてディスクリプタを設定します(ソースコード18)。
// Bodyスタイルのディスクリプタを生成 UIFontDescriptor *bodyFontDescriptor = [UIFontDescriptor preferredFontDescriptorWithTextStyle:UIFontTextStyleBody]; // イタリック体の属性を追加 bodyFontDescriptor = [bodyFontDescriptor fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitItalic]; // ディスクリプタからフォントを生成 UIFont *bodyFont = [UIFont fontWithDescriptor:bodyFontDescriptor size:0.0];
上記の通り、ディスクリプタを用いることで、ユーザー設定を活かしながらも独自のテキスト表現が可能となります。