Xcode6でiOSアプリに独自フォントを組み込んで表示する
以前書いた記事「iOSアプリに独自フォントを組み込んで表示する」の情報が古くなっているので最新の OS X と Xcode で動作するよう書き直しました。
この記事の内容は OS X Yosemite 10.10.2 & Xcode 6.2 の環境で動作確認しています。(2015/3/14 動作確認環境を更新)
iOSアプリに独自の外部フォントを組み込んで利用する、カスタムフォントの機能について解説します。この機能は iPhone OS(現iOS) 3.2 以降で利用できるようになりました。
Xcode6での変更点
Xcode6で独自フォントが従来より簡単に扱えるようになりました。主な変更点は以下のふたつです。
- Interface Builder上で独自フォントを指定し、表示できるようになった
- Info.plist にフォントファイル名を登録をする必要がなくなった
前者はXcodeの変更点リストにも書かれていますが、後者については情報が少なかったので調べてみました。これらについて、フォント追加の手順とともに説明します。
サポートしているフォント形式と無償フォントの紹介
カスタムフォントでサポートしているフォント形式は、
- PostScript Type1ベースのOpenType (拡張子 .otf)
- TrueTypeベースのOpenType (拡張子 .ttf)
- TrueType Collection (拡張子 .ttc) – 未確認
のようです(ちゃんと調べてはいませんが)。
ネット上ではTrueType Collectionが扱えるとの情報が見られますが公式の情報が見つけられませんでした。
今回は例として独立行政法人情報処理推進機構(IPA)が作成・配布している、無償のTrueTypeアウトラインベースのOpenTypeフォント「IPAexフォント(IPAex明朝)」を利用してみます。
ダウンロードはこちら> http://ossipedia.ipa.go.jp/ipafont/
ライセンスはこちら> IPAフォントライセンスv1.0
アプリ(プロジェクト)にフォントファイルを追加する手順
カスタムフォントを利用するには、フォントをアプリのバンドルリソースとして追加する必要があります。
Finderからフォントファイルをドラッグ&ドロップでOKです。
プロジェクトのフォルダにフォントファイルをコピーし、アプリのバンドルに追加するために、以下のようにチェックを入れて追加します。
念のため、Copy Bundle Resourcesにフォントファイルが追加されていることを確認するとよいでしょう。(2015/3/14 追記)
フォントを組み込む作業は以上になります。
追加したフォントをInterface Builderから利用する
フォントを追加するとInterface Builderのフォントリスト内に追加フォントが表示されて選択可能となっています。従来はこのリストにフォントが表示されず、IB上でフォントが指定できませんでした。
ラベルに追加したフォントを指定すると、見た目にも反映されてフォントが適用されていることがわかります。
追加したフォントをプログラムコードから利用する
IBで独自フォントを利用する場合とは異なり、プログラムコードからのみフォント指定する場合は フォントをプロジェクト(ターゲット)に追加しただけではfontWithName:size:でフォントオブジェクトが取得できない場合があるので注意が必要です。正しくフォントオブジェクトを取得するためには、
- Info.plistにフォントファイル名情報を追加する(従来の方法)
- StoryboardやxibなどのUIリソース内で追加したフォントを使用する
のいずれかが行われている必要があるようです。後者は分かりづらい仕様なので、プログラムコードからのみフォント変更を行う(IB上でフォント指定をしない)場合は従来の方法がよいでしょう。解説記事「iOSアプリに独自フォントを組み込んで表示する」を参照してください。
以下、従来の方法の補足です。UIFontのクラスリファレンスではfontWithName:size:の第一引数に指定するフォント名は、
The fully specified name of the font. This name incorporates both the font family name and the specific style information for the font.
とあります。フォントファミリ名を指定しても(たまたま)動作する場合もありますが、フォントファミリ名+スタイル名(Boldなど)の形式をもつPostScript名を指定しましょう。
まとめ
従来は Info.plist に “Fonts provided by application”のキー (UIAppFontsキー)を作り、配列要素としてフォントファイル名を手動で追加する必要がありました。Xcode6ではこの部分が自動化されており、ビルド時にバンドル内のInfo.plistに自動追加されるようになりました。
以下はビルド後の.app内のInfo.plistの内容です。フォントファイル名が登録されているのがわかります。
まとめると、Info.plistへのフォント自動追加の機能を利用するには、
- IB上でフォントを指定する場合 → フォント追加のみで良い
- IB上でフォント指定せず、プログラムコードからのみフォント指定する場合 → 従来通りInfo.plistにフォントファイル名を手動追加するのが安全
となります。