iOSでカスタムフォントを使う場合、いままで(自分の場合)は
- UILabelやUIButtonのサブクラスを作成(内部でfontプロパティをカスタムフォントで差し替える)
- IB 上で UILabel オブジェクトを置いて、"Custom Class" に 1 で作成したクラスを指定
- IB 上でフォントサイズ、色、レイアウトを決める
- ビルドして確認
ってなことをやってたわけですが、カスタムフォントは同じポイント数(pointSize)を指定しても全然サイズが違ったり、縦位置が全然違ったり、横に大きく広がったりということがザラで、 ビルドしてみるまでどう見えるかが未知数、という問題を抱えていました。「ちょっと大きかったなー」「もうちょい下か」「frame.size.width広げよう」みたいに調整する度にビルドするという。。
自分は比較的泥臭い作業耐性があるのでそんなもんだと思ってやってたわけですが、昨今のXcodeプラグインブームを見るにつけ、「どこかの偉い人がとっくに解決してくれてるのではないか」と思ってググってみたらやっぱりありました。
MoarFonts
Interface Builder 上でカスタムフォントを選ぶことができ、ばっちりプレビューもされます。
使い方は、プロジェクトにスクリプトを1行追加してビルドするだけ。
導入手順
moarfontsの実行ファイルを /usr/local/bin にコピーしておきます。
$ cp moarfonts /usr/local/bin/
下記ディレクトリのアクセス権を変更しておきます。
sudo chmod a+w /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator7.1.sdk/System/Library/.lilid
sudo chmod a+w /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator7.1.sdk/System/Library/.lilid/.lilic
使い方
[Build Phase] の + ボタンを押して [Run Script Build Phase] を追加して下記スクリプトを入力。
mdfind -onlyin "${SRCROOT}" "kMDItemContentTypeTree == public.font" -0 | sort -z | xargs -0 /usr/local/bin/moarfonts install
ビルドすれば上記スクリプトが実行され、あとはXcodeを再起動すればIBからカスタムフォントが選択・プレビューできるようになります。
トラブルシューティング
自分のXcodeプロジェクトで、IBのフォントのドロップダウンリストには出てくるものの、選んでも反映されない、ということがありました。
フォントをコピーするスクリプトの mdfind コマンドに渡すパスのあたりが怪しいと思い検証してみたものの、そこは正しくフォントファイルを検索できている様子。スクリプトの結果をログ出力させてみても success したと言っています。
Successfully installed xxxx (/Users/(中略)/Resorces/fonts/xxxx.otf)
いろいろ試してわかったのは、そのプロジェクトで使用していた複数のフォントファイルの、「フォント名がかぶっていた」ことが原因でした。不要な方を削除することで解決。
無料のはないの?
非常にありがたいMoarFontsですが、実は有料(10ドル)です。購入を決断する前に、無料のものも探してみました。
GitHub - deni2s/IBCustomFonts: IBCustomFonts category allows you to use custom fonts from Interface Builder (IB) when building your iOS apps. Apps using IBCustomFonts category are approved by Apple App Store (check readme.md on latest info). Tested on iOS6 - iOS11.
最初に見つけたのはこちらでした。
システムフォントの定義をカスタムフォントに置き換えることで、「カスタムフォントをIB上で選択」を実現するものです。Xcodeプラグインではなくプロジェクトに追加しておく方式で、
こちらの記事で紹介した『AutoNibL10n』とできることも実現方法(loadメソッド内でmethod swizzling)も似ています。
一番肝心な「IBでのプレビュー」ができないので今回の要件としてはアウト。
GitHub - 0xced/FontReplacer: Easily create nibs with custom fonts
良さそう、と思ったのですが、もう公開されてないようです。どうやら、上記のMoarFontsと同じ作者で、README には MoarFonts を使ってくださいと書いてあります。
そんなわけで、無料で「IBでカスタムフォントのプレビューができる」ものは見つけられず、MoarFontsをお買い上げ。短縮できる時間や自分でつくる時間を考えると、全然ありかなーと思います。