はじめに
こんにちは、レコチョクでiOSアプリ開発をしている副山です。
dヒッツのiOSアプリでは、Visual Regression Testing(以下、VRT)を導入しています。Interface Builderで作成されたUIをコードベースに移植する際に、VRTを実行するとテストが失敗するケースがありました。
VRTで失敗した部分は以下のように、日本語のテキスト部分はズレが発生していなかったのに対し、英語のテキスト部分ではズレが発生するというケースになっていました。
変更前UI | 変更後UI | Difference |
---|---|---|
この要因を調査したところ、System Fontsの使用に関して注意すべき点があることに気づいたため、この記事で紹介します。
VRTが失敗した原因
Interface Builderで作成されたUIのプロパティは、フォントが System Bold と設定されていました。
これをコードベースに移植する際に、以下のように実装していました。
label.font = .boldSystemFont(ofSize: 32.0) |
boldSystemFont(ofSize:) はメソッド名から、Weightに Bold が設定されると考えていましたが、実際には Semibold が設定されていました。これはView Hierarchyで確認できます。
その結果、英語部分のフォントが異なり、VRTで差異が検出されました。
一方、日本語部分では Bold と Semibold のWeightを変更してもフォントに変化がないため、差分は発生しませんでした。
Semibold | Bold | Difference |
---|---|---|
フォントのWeightを正しく Bold に設定するには、以下のように systemFont(ofSize:weight:) を使用します。
let label = UILabel() label.font = .systemFont(ofSize: 32.0, weight: .bold) |
この問題を調査する中で、System Fontsの挙動についてさらに詳しく知る必要があると感じました。
したがって、ここからは調査・検証した内容について説明します。
System Fontsとは
Appleは以下2種類のSystem Fontsを提供しています。
- San Francisco(SF)
デジタルディスプレイでの表示に最適化されており、視認性や可読性が高いフォントです。SFはサンセリフ体で、シンプルでモダンなデザインが特徴です。日本ではゴシック体にあたります。
-
New York(NY)
クラシックでエレガントな印象を与えるフォントで、長文の可読性を重視した設計がなされています。NYはセリフ体で、日本では明朝体にあたるものです。
また、上記のフォントには以下の9種類のWeightが提供されています。
- UltraLight
- Thin
- Light
- Regular
- Medium
- Semibold
- Bold
- Heavy
- Black
iOSやiPadOSのSystem Fontsは、San Francisco Font Familyに内包されるSF Proが使用されています。しかし、SF Proには日本語のグリフ(文字)が含まれていません。このことは、AppleのフォントダウンロードサイトからSF Proをダウンロードして、Mac標準のFont Bookアプリから確認できます。
そのため、日本語のテキストを表示する際には、代わりにHiragino Sans(ヒラギノ角ゴシック)が使用されます。
System FontsのWeightによる挙動の違い
今回はiPadのSimulatorを使用して、各言語でWeightの設定によってフォントがどのように変化するかを検証しました。
日本語以外の2バイト文字を扱う韓国語と中国語の挙動も気になったので検証しました。
検証環境
- iOS, iPadOS:17.5, 18.0
- Xcode:15.4, 16.0
- Simulatorの設定言語(優先度順):日本語、English、简体中文
- Font size:32.0pt
検証結果
iOS17.5(Xcode15.4) | iOS18.0(Xcode16.0) |
---|---|
英語や数字はSF Proが使用されるため、Weightに応じてフォントが変化していることがわかります。
一方、日本語、韓国語、中国語のオレンジ色で囲った箇所を見ると、Weightを変更してもフォントに変化がないケースがあることがわかりました。
結果をまとめると、以下のようになりました。
- 日本語:UltraLightとThin、BoldとSemiboldで同じフォント
- 韓国語:BoldからBlackまで同じフォント
- 中国語:iOS17.5ではMediumからBlackまで同じフォント、iOS18.0ではHeavyとBlackで同じフォント
まとめ
本記事では、開発中に遭遇したSystem Fontsを使用するときの注意点について解説しました。
Interface BuilderからコードベースにUIを移植する際や、フォントのWeightを指定する際には、日本語と英語でフォントの挙動が異なることに注意してください。
また、VRTを実装していたおかげでデグレの発生に気づくことができ、失敗時の画像が原因の調査に役に立ちました。
VRTの正解画像を作成する際には、日本語だけでなく英語や数字を含めたモックデータを用意することで、フォントのWeightによる差分を検出しやすくなるので参考にしてみてください。
最後までお読みいただきありがとうございました。
参考
- boldSystemFont returns “semibold” – Jihyun’s blog
- ios – Why ‘UIFont.boldSystemFont’ is not ‘UIFontWeightBold’? – Stack Overflow
- Appleの言う(iOSの)boldはsemibold – ぜのぜ
- タイポグラフィ – Human Interface Guidelines
- 【iOS】System Fontの和文(日本語)について