【Swift】日本語のSystem FontsでのWeightを指定するときの注意点

iOS, Swift, System Fonts, Typography, Xcode

はじめに

こんにちは、レコチョクでiOSアプリ開発をしている副山です。

dヒッツのiOSアプリでは、Visual Regression Testing(以下、VRT)を導入しています。Interface Builderで作成されたUIをコードベースに移植する際に、VRTを実行するとテストが失敗するケースがありました。

VRTで失敗した部分は以下のように、日本語のテキスト部分はズレが発生していなかったのに対し、英語のテキスト部分ではズレが発生するというケースになっていました。

変更前UI 変更後UI Difference
image-7.png image-8.png image-9.png

この要因を調査したところ、System Fontsの使用に関して注意すべき点があることに気づいたため、この記事で紹介します。

VRTが失敗した原因

Interface Builderで作成されたUIのプロパティは、フォントが System Bold と設定されていました。

image-2.png

これをコードベースに移植する際に、以下のように実装していました。

boldSystemFont(ofSize:) はメソッド名から、Weightに Bold が設定されると考えていましたが、実際には Semibold が設定されていました。これはView Hierarchyで確認できます。

image-3.png

その結果、英語部分のフォントが異なり、VRTで差異が検出されました。

一方、日本語部分では BoldSemibold のWeightを変更してもフォントに変化がないため、差分は発生しませんでした。

Semibold Bold Difference
image-4.png image-5.png image-6.png

フォントのWeightを正しく Bold に設定するには、以下のように systemFont(ofSize:weight:) を使用します。

この問題を調査する中で、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)
image-1.jpg image-10.jpg

英語や数字は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による差分を検出しやすくなるので参考にしてみてください。

最後までお読みいただきありがとうございました。

参考