iOS9からのシステムフォント San Francisco を理解する


# iOS9からのシステムフォント San Francisco を理解する

iOS9からシステムフォントがSan Franciscoに変更されました。

San FranciscoはApple純正のフォントで、OS X, iOS, watchOS, tvOSというAppleのデバイス上で動作するOSのためのフォントです。

## UI & Compact
San Franciscoフォントは**2種類用意されています**。

[Apple公式のSan Francisco](https://developer.apple.com/fonts/)のページを見ると以下のようなすみわけとなっていることがわかります。

<img width="961" alt="スクリーンショット 2015-12-04 13.46.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/45525/cf2faab4-2f0e-f568-206f-70a23cb710b5.png">

San FranciscoとSan Francisco Compactの2種類です。

**San Franciscoは、iOS, OS X, tvOS**となっていいます。**San Francisco CompactはwatchOS**専用のフォントとなっています。

## Display & Text
上記、Appleのページから以下のような.otfファイルがダウンロード可能です。

iOS, OS X, tvOS用のSan Franciscoに含まれるファイルはこちら。"SF-UI"という名前になっています。
<img width="401" alt="スクリーンショット 2015-12-05 12.56.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/45525/7076173b-c1ca-0007-aedc-0f40e1151e3b.png">

watchOS用のSan Francisco Compactに含まれるファイルはこちら。"SF-Compact"という名前になっています。
<img width="403" alt="スクリーンショット 2015-12-05 12.55.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/45525/34d0d84e-9ef1-1e75-8eef-34146fb8aad6.png">

それぞれのファイル名を見てみると、さらに"Display"と"Text"の2種類に分類されており、その分類ごとにウェイト（文字の太さ）が複数あることが分かります。。WWDC2015の[Introducing the New System Fonts](https://developer.apple.com/videos/play/wwdc2015-804/)のスライドに載っていたこちらの図が分かりやすいです。

<img width="1015" alt="スクリーンショット 2015-12-05 13.07.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/45525/048e96b3-7eca-0059-04f6-5253fab2ae98.png">

この図を見てみると**"Display"よりも"Text"の方がウェイトの種類が少ない**ことが分かります。

この違いは以下の図を見るとよく分かります(こちらもWWDC2015のセッションのスライドに載っていたものです)。

<img width="935" alt="スクリーンショット 2015-12-05 13.13.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/45525/34ba1aad-694b-e032-7d60-043a973361f1.png">

**Displayはフォントサイズが20pt以上の場合に使用**され、**Textは20pt未満の場合に使用**されます。iOSなどのデバイス上では確かにそのように動作していました。

しかしこの切り替えは**Photoshopなどで使用する際には行われません。**つまり、デザイナーがモックを作成する際は、**サイズによってフォントが変わることを理解しておかなければいけない**ということになります。

## Weight
ウェイトは以下のように9段階用意されています。

<img width="928" alt="スクリーンショット 2015-12-05 13.29.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/45525/9b0851fb-4208-a073-d2fb-044629307d5f.png">

これらのウェイトをコード上から指定するためのAPIが`UIFont`に追加されています。

```swift
public class func systemFontOfSize(fontSize: CGFloat, weight: CGFloat) -> UIFont
```

`weight`には以下の定数を使用します。

```swift
public let UIFontWeightUltraLight: CGFloat
public let UIFontWeightThin: CGFloat
public let UIFontWeightLight: CGFloat
public let UIFontWeightRegular: CGFloat
public let UIFontWeightMedium: CGFloat
public let UIFontWeightSemibold: CGFloat
public let UIFontWeightBold: CGFloat
public let UIFontWeightHeavy: CGFloat
public let UIFontWeightBlack: CGFloat
```

## 日本語
では日本語フォントはどうなっているのでしょうか？

iOS9の実機でキャプチャしたものを、上からUltraLight〜Blackまでずらっと並べてみました。
![sanfrancisco_japanese.png](https://qiita-image-store.s3.amazonaws.com/0/45525/b9349963-60af-15e4-4429-6b869babc671.png)

見たところ、UltraLightとThinは同じ、LightはUltraLightとThinよりも太め、RegularとMediumがさらに太め、、Semibold〜Blackは同じ太さに見えます（違っていたらご指摘ください）。

この図から分かることは**iOSの日本語では9段階のウェイトを使用することができない**ということです。

なお、OS X El Capitanではヒラギノ角ゴシックはW0〜W9まで使用することが可能です。
<img width="432" alt="スクリーンショット 2015-12-05 14.42.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/45525/3fd6caf6-cc0c-d942-bdd9-910c5ce2d31e.png">

### iOS9のフォント一覧

以下のコードでiOS9で使用可能なフォントを出力してみました。

```swift
UIFont.familyNames().map {UIFont.fontNamesForFamilyName($0)} .flatten() .sort() .forEach { print("\($0)") }
```
（この出力に使用している関数は[こちらの記事](http://qiita.com/mo_to_44/items/cf83b22cb34921580a52)で解説しているので、「何をしているのか分からない」という方は見てみてください）。



#### 出力結果
```
AcademyEngravedLetPlain
AlNile
AlNile-Bold
AmericanTypewriter
AmericanTypewriter-Bold
AmericanTypewriter-Condensed
AmericanTypewriter-CondensedBold
AmericanTypewriter-CondensedLight
AmericanTypewriter-Light
AppleColorEmoji
AppleSDGothicNeo-Bold
AppleSDGothicNeo-Light
AppleSDGothicNeo-Medium
AppleSDGothicNeo-Regular
AppleSDGothicNeo-SemiBold
AppleSDGothicNeo-Thin
AppleSDGothicNeo-UltraLight
Arial-BoldItalicMT
Arial-BoldMT
Arial-ItalicMT
ArialHebrew
ArialHebrew-Bold
ArialHebrew-Light
ArialMT
ArialRoundedMTBold
Avenir-Black
Avenir-BlackOblique
Avenir-Book
Avenir-BookOblique
Avenir-Heavy
Avenir-HeavyOblique
Avenir-Light
Avenir-LightOblique
Avenir-Medium
Avenir-MediumOblique
Avenir-Oblique
Avenir-Roman
AvenirNext-Bold
AvenirNext-BoldItalic
AvenirNext-DemiBold
AvenirNext-DemiBoldItalic
AvenirNext-Heavy
AvenirNext-HeavyItalic
AvenirNext-Italic
AvenirNext-Medium
AvenirNext-MediumItalic
AvenirNext-Regular
AvenirNext-UltraLight
AvenirNext-UltraLightItalic
AvenirNextCondensed-Bold
AvenirNextCondensed-BoldItalic
AvenirNextCondensed-DemiBold
AvenirNextCondensed-DemiBoldItalic
AvenirNextCondensed-Heavy
AvenirNextCondensed-HeavyItalic
AvenirNextCondensed-Italic
AvenirNextCondensed-Medium
AvenirNextCondensed-MediumItalic
AvenirNextCondensed-Regular
AvenirNextCondensed-UltraLight
AvenirNextCondensed-UltraLightItalic
Baskerville
Baskerville-Bold
Baskerville-BoldItalic
Baskerville-Italic
Baskerville-SemiBold
Baskerville-SemiBoldItalic
BodoniOrnamentsITCTT
BodoniSvtyTwoITCTT-Bold
BodoniSvtyTwoITCTT-Book
BodoniSvtyTwoITCTT-BookIta
BodoniSvtyTwoOSITCTT-Bold
BodoniSvtyTwoOSITCTT-Book
BodoniSvtyTwoOSITCTT-BookIt
BodoniSvtyTwoSCITCTT-Book
BradleyHandITCTT-Bold
ChalkboardSE-Bold
ChalkboardSE-Light
ChalkboardSE-Regular
Chalkduster
Cochin
Cochin-Bold
Cochin-BoldItalic
Cochin-Italic
Copperplate
Copperplate-Bold
Copperplate-Light
Courier
Courier-Bold
Courier-BoldOblique
Courier-Oblique
CourierNewPS-BoldItalicMT
CourierNewPS-BoldMT
CourierNewPS-ItalicMT
CourierNewPSMT
Damascus
DamascusBold
DamascusLight
DamascusMedium
DamascusSemiBold
DevanagariSangamMN
DevanagariSangamMN-Bold
Didot
Didot-Bold
Didot-Italic
DiwanMishafi
EuphemiaUCAS
EuphemiaUCAS-Bold
EuphemiaUCAS-Italic
Farah
Futura-CondensedExtraBold
Futura-CondensedMedium
Futura-Medium
Futura-MediumItalic
GeezaPro
GeezaPro-Bold
Georgia
Georgia-Bold
Georgia-BoldItalic
Georgia-Italic
GillSans
GillSans-Bold
GillSans-BoldItalic
GillSans-Italic
GillSans-Light
GillSans-LightItalic
GillSans-SemiBold
GillSans-SemiBoldItalic
GillSans-UltraBold
GujaratiSangamMN
GujaratiSangamMN-Bold
GurmukhiMN
GurmukhiMN-Bold
Helvetica
Helvetica-Bold
Helvetica-BoldOblique
Helvetica-Light
Helvetica-LightOblique
Helvetica-Oblique
HelveticaNeue
HelveticaNeue-Bold
HelveticaNeue-BoldItalic
HelveticaNeue-CondensedBlack
HelveticaNeue-CondensedBold
HelveticaNeue-Italic
HelveticaNeue-Light
HelveticaNeue-LightItalic
HelveticaNeue-Medium
HelveticaNeue-MediumItalic
HelveticaNeue-Thin
HelveticaNeue-ThinItalic
HelveticaNeue-UltraLight
HelveticaNeue-UltraLightItalic
HiraMinProN-W3
HiraMinProN-W6
HiraginoSans-W3
HiraginoSans-W6
HoeflerText-Black
HoeflerText-BlackItalic
HoeflerText-Italic
HoeflerText-Regular
IowanOldStyle-Bold
IowanOldStyle-BoldItalic
IowanOldStyle-Italic
IowanOldStyle-Roman
Kailasa
Kailasa-Bold
KannadaSangamMN
KannadaSangamMN-Bold
KhmerSangamMN
KohinoorBangla-Light
KohinoorBangla-Regular
KohinoorBangla-Semibold
KohinoorDevanagari-Light
KohinoorDevanagari-Regular
KohinoorDevanagari-Semibold
KohinoorTelugu-Light
KohinoorTelugu-Medium
KohinoorTelugu-Regular
LaoSangamMN
MalayalamSangamMN
MalayalamSangamMN-Bold
MarkerFelt-Thin
MarkerFelt-Wide
Menlo-Bold
Menlo-BoldItalic
Menlo-Italic
Menlo-Regular
Noteworthy-Bold
Noteworthy-Light
Optima-Bold
Optima-BoldItalic
Optima-ExtraBlack
Optima-Italic
Optima-Regular
OriyaSangamMN
OriyaSangamMN-Bold
Palatino-Bold
Palatino-BoldItalic
Palatino-Italic
Palatino-Roman
Papyrus
Papyrus-Condensed
PartyLetPlain
PingFangHK-Light
PingFangHK-Medium
PingFangHK-Regular
PingFangHK-Semibold
PingFangHK-Thin
PingFangHK-Ultralight
PingFangSC-Light
PingFangSC-Medium
PingFangSC-Regular
PingFangSC-Semibold
PingFangSC-Thin
PingFangSC-Ultralight
PingFangTC-Light
PingFangTC-Medium
PingFangTC-Regular
PingFangTC-Semibold
PingFangTC-Thin
PingFangTC-Ultralight
SavoyeLetPlain
SinhalaSangamMN
SinhalaSangamMN-Bold
SnellRoundhand
SnellRoundhand-Black
SnellRoundhand-Bold
Symbol
TamilSangamMN
TamilSangamMN-Bold
Thonburi
Thonburi-Bold
Thonburi-Light
TimesNewRomanPS-BoldItalicMT
TimesNewRomanPS-BoldMT
TimesNewRomanPS-ItalicMT
TimesNewRomanPSMT
Trebuchet-BoldItalic
TrebuchetMS
TrebuchetMS-Bold
TrebuchetMS-Italic
Verdana
Verdana-Bold
Verdana-BoldItalic
Verdana-Italic
ZapfDingbatsITC
Zapfino
```

## 数字を扱う際の注意

数字をアニメーションさせるときは注意しましょう。例えばカウントアップなどがそれにあたると思います。

San Franciscoはプロポーショナルなので、この数字に**カウントアップさせるアニメーションをつけるとガタガタ**になってしまいます。[Introducing the New System Fonts](https://developer.apple.com/videos/play/wwdc2015-804/)の26分くらいから解説されていています。
<img width="1009" alt="スクリーンショット 2015-12-05 15.02.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/45525/7f5c4512-4f9e-93b3-b104-2e6a2cee8414.png">

San Franciscoにはmonospaced、等幅のフォントも用意されています。
<img width="1010" alt="スクリーンショット 2015-12-05 15.02.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/45525/202738cf-3af3-30cd-d777-d8d3185d493b.png">


`UIFont`に等幅指定するためのAPIが用意されています。

```swift
public class func monospacedDigitSystemFontOfSize(fontSize: CGFloat, weight: CGFloat) -> UIFont
```

アニメーションなどの動的に変更される可能性がある`UILabel`などがある場合はこちらを使用しましょう。動的に変更される可能性がないのであればプロポーショナルの使用が推奨されます。

## まとめ
San Franciscoにはまだまだ注意すべき点があるのですが、さらに細かな内容は[Introducing the New System Fonts](https://developer.apple.com/videos/play/wwdc2015-804/)をご覧ください。

San Franciscoはサイズによってフォントが自動的に切り替わったり、デバイスでフォントが異なるなど注意すべき点があります。

ですが、これらはユーザーの視認性を配慮したものなので、これらの特性を踏まえておくことで、デバイスとOSの特長を生かしたアプリケーションの開発ができると思います。

iOS7からDynamic Fontという仕組みが導入されています。またiOS8以降はAdaptiveにアプリケーションのUIを構築することが推奨されているので、フォントのサイズはDynamic Fontを使用してユーザーが設定できるようにすることが良いのではないかと思います。

### サンプルコード
[こちら](https://github.com/mnat44/WWDC2015Samples)にサンプルコードを置いてあります。UltraLight〜Blackまでのフォントが日本語、アルファベット両方で閲覧可能になっています。

<img width="375" alt="Simulator Screen Shot 2015.12.05 14.58.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/45525/8f67ed9f-e906-c56b-9e29-a8a7c1d5f22d.png">
※このスクリーンショットはシミュレーターのものです

この記事では言及しませんでしたが、watchOSでもフォントの確認が可能なサンプルを作成しているので、San Francisco Compactがどのように表示されるかの確認も可能です。

![Simulator Screen Shot 2015.12.05 14.58.07.png](https://qiita-image-store.s3.amazonaws.com/0/45525/3f614c15-23ed-06b0-bfdd-251304d1c584.png)
※このスクリーンショットはシミュレーターのものです

### 資料
* [Introducing the New System Fonts](https://developer.apple.com/videos/play/wwdc2015-804/)
* [Apple公式サイト](https://developer.apple.com/fonts/)