ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
UIタイポグラフィーの詳細
読みやすさや、アクセシビリティ、Appleプラットフォーム全体における一貫性を強化する卓越したタイポグラフィーをAppのユーザーインターフェース内で実現する方法について学習します。視覚上のサイズやウェイト調整を容易にする可変フォントへの動きを含め、San Franciscoフォントファミリーの最新の進化の内容について把握しましょう。システムフォントを最大限利用する方法や、カスタムフォントでDynamic Typeをサポートする方法についてのコツも公開します。San Franciscoフォントファミリーの背景となる原則について、知識を改めたい方は、WWDC15の"Introducing the New System Fonts"をご参照ください。
リソース
関連ビデオ
WWDC22
WWDC20
WWDC19
-
ダウンロード
こんにちは WWDCへようこそ
“UIタイポグラフィーの詳細” 私はロイック・サンダー デザインチームの書体デザイナーです 同僚のジャンと一緒に インターフェイスの タイポグラフィーの細部と アプリケーションに用いるための ツールを紹介します 本日のトピックスは プラットフォームでのテキストの ダイナミックな挙動の理解です まずはフォントと インターフェイスのデザインについて話します ジャンからは便利なAPIと タイポグラフィーのよい事例を紹介します 文字はフォントとサイズを 選ぶだけでいいと 大抵の人は考えるでしょう しかし実際のところ― テキストのサイズを変えると さまざまな結果が生まれます オプティカル・サイズについて学ぶことで 読みやすさをより理解できます
次にバリアブルフォントについて 少し話します プラットフォームでの テキストの挙動を向上し アプリケーションの タイポグラフィーを改善します
そして インターフェイスのデザインに影響する トラッキングとレディングの話を レイアウトには不可欠なので この機会に ぜひ知っておいてください ジャンがテキストスタイルと Dynamic Typeを説明します すばらしいデザインを かなえるツールです 新しくないAPIもありますが 最新の情報を お伝えします では始めましょう “オプティカル・サイズ” まず数年前のことから 説明していきます システムフォントの San Franciscoが開発された時です 我々の目標は すべてのサイズの見た目のよさでした 2つのバージョンを加えて 目標を達成しました サイズが20ポイント未満のSF Textと それより大きいSF Displayです これらがオプティカル・サイズです
文字がさらに読みやすくなります 例えば SF TextとSF Displayの文字間隔は それぞれのサイズに合わせて変えられます
それぞれの縦の比率も少し違います 同じサイズでも SF Textのほうが少し大きく見えます 小さいサイズでも読みやすいです
このデザインの発表は ちょっとしたレボリューションでしたが “レボリューション”という言葉は面白い 前進を意味すると思いがちですが “初めに戻る”の意味もあります オプティカル・サイズは 活版印刷の時代から存在します 何世紀も変わらない道具も含めて― 印刷工程もそのままです デジタル技術は 柔軟性をもたらしましたが タイポグラフィーは 昔ほど洗練されていません そこで 本来の オプティカル・サイズをご覧ください 僕は活字と歴史好きで この18世紀の本を持っています いわゆる活字見本です さまざまなサイズが載っています 2つの例を お見せします デザインは同じで サイズが違います SF TextとSF Displayのようです 現代の印刷なら 8ポイントと42ポイントくらいです
それぞれの文字サイズに合わせて 金属の活字を手作業で作りました
スチールの型を使って 活字の文字が作られます スチールの型は 鋳造の過程で使われます 型に金属を流し入れ 金属の活字が出来上がります
細部を見ていくと 手作業への 物理的なサイズの影響が分かります 8ポイントはサイズが小さいので でこぼこです オプティカル・サイズの点では 変形が難しいということです
金属とインクで 紙に印刷するという挑戦への 鋳型職人の闘いとも言えます 我々にとってはピクセルグリッドに― ラスタライズされたベクター画像の挑戦です しかし出力の種類に関係なく オプティカル・サイズの変化は 読みやすさと細部のバランスです この2つは無関係でなく 読みやすさは細部で決まります SF TextとSF Displayと同様に 文字間隔が重要な細部です
文字が小さくなると より間隔が必要です そうすれば 見分けやすくなります 文字の形にも 意味のある細部があります 文字の細い部分は サイズが小さくなると 目立つ必要があります
例えば“i”の点の位置が 間違っていると思うかもしれません しかし これは意図的なもので 小文字の“l”と間違わないためです インクでもピクセルでも 隙間が狭いと 埋まりやすくなります
相対的なサイズが関係しています 意図された縮尺比率を 見ていきましょう デザインの違いは それほど目立ちません それがオプティカル・サイズの目的です 読みやすさと見た目が釣り合い― デザインが縮尺と調和しています デザインを縮尺に合わせることは 数世紀前は直接の作業でした 実寸で作ったからです それに対して デジタルは不運な問題に直面しました
ベクター画像の縮尺は ほぼ無限で デジタルフォントでは 各グリフの描画は1つだけです 書体デザイナーは 理想のサイズを選ぶ必要があります 使用するフォントには 効果を発揮するサイズがあります
複数サイズに適応した マルチプルなフォントも作れます しかし お勧めしません 作業が大変で 何よりも― 使いにくいフォントファミリーになります 熟慮して San Franciscoを作り オプティカル・サイズを 2つだけ持つことにしました
OSは2つのデザインを 自動で切り替えられるからです そしてSF TextとSF Displayを 公開することにしました この数年 プラットフォームで 最先端の機能でしたが もっと改善したいと思っていました TextとDisplayを切り替えなくても 1つのフォントが各サイズに 自動で適応すれば すばらしい これは数年後に可能になりました 2016年に発表したバリアブルフォントは OpenTypeの仕様を発展させたものです ウェブフォントの人気の高まりと 既存のフォントのフォーマットの 限界への挑戦から作られました フォーマットは グリフの収録方法を変えます グリフは1つの静的描画に限定されません 関連している別のグリフを作る 各ポイントの動きを記述します この動きは デザインの軸と結びつき ソフトウェアが挙動をコントロールします これらの軸の1つが オプティカル・サイズの実行に 関わっています SF Proをアップデートし 既存のオプティカル・サイズを改良できました この新しい挙動の可能性は セリフ体のNew Yorkで示されます サイズへのさまざまな適応が目立ちます
オプティカル・サイズのおかげで 縮尺に完璧に合った書体を デザインできます 昔の活字の優れた点を 取り戻しています 今年は個別のフォントとしての オプティカル・サイズから変わります オプティカル・サイズだけでなく ウエイトも統合されます 大部分のシステムフォントは 1つのバリアブルフォントとして ダウンロードされます 移行緩和のため 今年も TextとDisplayのフォントを公開します デザインツールには バリアブルフォントの 新しいコントロールがあります 大抵はパブリックな軸のスライダです
しかし これは任意で 事前登録されたフォントでは いつもどおり使えます システムフォントを使う場合は 事前登録のフォントのままがいいです
オプティカル・サイズを サポートしている場合は 特定の範囲のサイズを対象とした 専用のスライダがあります 使用しているポイントサイズに応じて スライダの値は変わります
アプリケーションによっては コントロールの値が自動で変わりません
スライダの値が適していない時は 自分で設定する必要があります
ポイントサイズが大きくても 問題ありません 一番近い値に設定してください 以前のOSでツールを使う場合は バリアブルフォントが 使えないかもしれません その場合は以前のように SF TextとSF Displayなど 個別のオプティカル・サイズを使ってください
コードでは この挙動は自動です オプティカル・サイズとポイントサイズを 同期させています システムフォントに適応します オプティカル・サイズの軸があれば カスタムバリアブルフォントにも適応します サイズごとのタイポグラフィーの 最新情報は ここまでです インターフェイスの テキストレイアウトをお話しします トラッキングとレディングです
トラッキングは サイズごとのタイポグラフィーに不可欠です オプティカル・サイズの説明をしましたが 話してないことがあります トラッキングと組み合わせると オプティカル・サイズは効果が出ます まずはトラッキングの説明をします 最初に フォントのグリフを見ましょう ある程度のスペースを組み込んでいます このスペースはサイドベアリングです グリフの描画でデザインされ デフォルトの間隔を決めます
しかしテキストは どのサイズでもよく見える― 文字の間隔を必要とします
文字間隔を取り それを調整するのを トラッキングと呼びます CSSでのように 文字間隔と同義ですが レイアウトでグリフの間に スペースを入れることを特に指します 困惑している人もいるでしょう “カーニングだと思っていた”と
混同しがちですが トラッキングとカーニングは違います
カーニングは 文字と文字の間の調整だけです 書体デザイナーが調整するもので 開発者が修正する必要は ほぼありません トラッキングに戻って― San Franciscoでの 使い方を説明します
SF TextやSF Displayのように サイズごとにスペースを調整する時でも トラッキングなら うまく調整できます
トラッキングを使わず 20ポイントでフォントを切り替えると SF TextとSF Displayの スペースの違いが問題になります
青の最後の行と オレンジの最初の行は ほとんど同じ長さです しかしポイントサイズは違います
デフォルトのスペースが違い― 急激な変化のために トラッキングとオプティカル・サイズを使います システムフォントの挙動には 不可欠な部分です そこで トラッキングテーブルを Apple Design Resourcesで公開しています システムフォントの挙動を 正確に再現したいなら トラッキングの適用の度合を 知る必要があります 今年はSF Proが バリアブルフォントになり 20ポイントに大きな変化はありません 17~28ポイントの間で デザインがTextからDisplayへ移行します 挙動に基本的な変化があり トラッキングテーブルを アップデートしました 新しいSF Proを使う時には 17~28ポイントのトラッキングの値の 新しいセットを適用してください トラッキングのグラフを見て もう1点お伝えします フォントには複数の トラッキングテーブルが入ります それでトラッキングの値を加え 文字列の調整も可能になります 文章が途切れているとします
よくある解決策は カーニングのAPIでしょうか しかしカーニングは 理想的でありません
トラッキングのAPIのほうがいい 意味的に正しいです それにトラッキングと 相性が悪い合字などの タイポグラフィーの特徴の 使用を停止できます
合字のある単語を カーニングAPIでトラッキングすると 合字は残り 単語のリズムが崩れます しかしトラッキングAPIは 合字を切り離せます 文字の間隔も均一です
しかし望ましい最良の解決策は 自動的に間隔が狭くなることです タイトなトラッキングテーブルを使います このAPIでは 読みやすい範囲内で システムが文字列を調整します トラッキングしすぎる場合があるからです そういう場合は 途切れたままでいいでしょう
このAPIはサイズごとの トラッキングを適用します 自分でトラッキングするなら 手動で実行します “ドキュメントのフォントのトラッキング” それでは最後に少し告知を 他社製のフォントも トラッキング可能にしました “trackとSTATのテーブルを含む すべてのフォント” フォント販売者は自分のフォントに テーブルを追加できます フォントにSTATのテーブルが含まれれば 埋め込みのトラッキングが プラットフォームで可能です
kCTFontOpticalSizeAttributeの適用で 古いOSでトラッキングデータと使えます
グリフの間のスペースは見ましたが 次はラインの間の スペースについて考えましょう
再び 言葉の意味から 用語を明確にしていきます 最初はラインハイトです
ラインハイトは フォントの縦方向の幅です ベースラインの間を測っても構いません どの測り方でも 長さは同じです
ラインの間の距離が増加し その間のスペースがレディングです
余談ですが 名前は 金属の活字時代に由来します 活字の間に鉛の板が 入っていたことからです
ラインの間にレディングがある場合は ラインハイトにレディングが含まれます 一方の値が変われば もう一方の値も変わります
レディングとラインハイトに困ることは ほとんどありません 大部分のインターフェイスの要素で 設定済みです しかし修正の例を 2つ お見せしましょう
アラビア語による記述です 上下に伸びる部分が多いです 周りの線を越えていくかもしれません その場合 レディングを加えるのがいいでしょう
アラビア語など 高いラインハイトの言語では プラットフォームに レディングを増やしています
狭いレディングが役立つこともあり コンパクトな表示になります watchOSでは 狭いレディングを多用し 最大限の情報を表示しています
テキストスタイルを使用した調整です 後ほど ジャンが説明します
この2つは我々の取り組みを示す よい実例となったと思います 既存のシステムAPIで 毎年のデザインの改良を利用できます 新しいAPIは 導入しやすいものを目指しています アプリケーションを向上してくれます ジャンに引き継ぐ いいタイミングです パワフルなフォントとテキストのAPIを 紹介してくれます ありがとう ロイック タイポグラフィーの詳細に関する話の後は テキストスタイルとDynamic Typeの話です これらのシステムツールは 一貫した タイポグラフィーを作成するのに役立ちます
テキストスタイルは Appleのインターフェイス構築の基本です 柔軟で一貫したタイポグラフィーを 実現する枠組みとして― 明確な階層と幅広いスタイルを備え 大半のインターフェイスに対応できます
テキストスタイルは― システムフォントのウエイト ポイントサイズ レディングを組み合わせて定義したものです このシステム機能は タイポグラフィーの階層を提供し― 読みやすいレイアウトを 実現する助けになります
テキストスタイルには情報の階層を表せるよう 幅広いフォントサイズがありますが― 細かな違いを表すのに サイズだけでは不十分なことがあります
例えば これは“カレンダー”の年と月です 標準のテキストスタイルより 文字が太いですね 強調版のテキストスタイルを使うと 同じサイズでウエイトを変えられます システムアプリケーションでは よく見かけます 例えば “メール”の タイトルバーで使っているのは― 強調版のタイトル用テキストスタイルです アプリケーションでの 使用方法を紹介しましょう
title1フォントのラベルがあるとします このタイトルを強調するため ウエイトを“bold”にします 強調版のtitle1は次のようになります
UIFont preferredFont(withTextStyle:) APIの代わりに― UIFontDescriptor APIで title1スタイルの記述子を取得します boldシンボリックトレイトを適用すると 強調版のtitle1スタイルになります これはSF Pro Boldに対応します
boldをNSFontやUIFontやSwiftUIフォントに使い 強調版のフォントを作成できます このシンボリックトレイト名は“bold”ですが 実際のウエイトは テキストスタイルによって違います “medium”“semibold”“bold” また“heavy”もあります テキストスタイルにはラインハイトがあり 大抵は適切な幅になっています しかしスペースが限られる場合は― 行間を狭めることで 情報の密度を高められます フィットネスアプリがいい例です あるいは多くのテキストを表示する時― 読みやすさのために もう少し空間が欲しいことがあるでしょう “マップ”などがそうです これにはテキストスタイルのレディングで 幅を調整します iOSとmacOSでは狭いレディングを使うと ラインハイトが2ポイント減り― 広いレディングを使うと 2ポイント増えます watchOSでは増減幅は1ポイントです
長い段落を考えてみましょう 使っているのはbodyテキストスタイルです 今 ラインハイトは22ポイントですが― この幅を狭くすると どう見えるか試してみます 分かりますね TightLeadingシンボリックトレイトを 適用すると― ラインハイトは20ポイントになります これは長い段落には 狭すぎるように見えるので― 今度は広いレディングを使います LooseLeadingトレイトで 24ポイントにしました 見やすいですね 強調する時に行ったことと 同様の処理です 今度はTightLeadingとLooseLeadingの― シンボリックトレイトを使いました 今年から テキストスタイルのレディング調整は SwiftUIでも可能です
Appleはシステムとアプリケーションに New YorkとSF Pro Roundedを使っています “ブック”と“リマインダー”の例です これらは単独のタイプフェースとして 使われるほか― テキストスタイルとも連動します
リマインダーのようなラベルを 作りたいとします 強調版テキストスタイルを使ってみましょう テキスト“Today”に タイトル用の強調版テキストスタイルを使います 今 これはSF Pro Boldです
FontDescriptor withDesign APIで 丸いデザインにしましょう フォントはSF Pro Roundedに変わります
柔軟なAPIを使って こうしたデザインを― どのシステムUIフォントにも適用できます AppKitとUIKitでは FontDescriptor withDesign APIをどのUIフォントにも使えます
SwiftUIの場合 APIは少し違います フォント作成時に最初にデザインを渡し― 修飾子を使った既存フォントの変換は行いません テキストスタイルを デザインと指定する時― デザイン以外の要素は変わりません フォントサイズ ウエイト ラインハイトは同じです ウェブページやアプリケーションの ウェブ表示を扱う方も多いでしょう Webkitへの“-apple-system” フォントファミリーの導入以来― CSSではSan Franciscoを使用できます これは広く普及しました
今は“-apple”のない “system-ui”が標準名です 今年初めには新しい CSSフォントファミリー名として― “ui-rounded”“ui-serif” “ui-monospace”なども加わりました 今年からテキストスタイルのAPIは macOSでフルサポートされています AppKitでCocoaアプリケーション向けに 導入された新しいAPIは― iOSと同様に あらゆる テキストスタイルに対応します フォントサイズはmacOSテキストに 沿って調整され― Dynamic Type未対応ながら テキストスタイルの他の利点を活用できます 去年紹介したCatalystアプリケーションの テキストスタイルサイズは― iOS向けに77%縮小したサイズです 今年 Catalystアプリケーションの インターフェイスがMac用に最適化され 新しいテキストスタイルサイズが定められました
77%版に近いサイズなので― アプリケーションの変更は 最小限で済みます
“Scale Interface to Match iPad”を選ぶと 77%のiOSサイズを引き続き使用できます 新しい動作をご希望なら― “Optimize Interface for Mac”を選びます
iOSにはテキストスタイルの新機能 Dynamic Typeが加わりました 設定に沿って フォントを 自動的に拡大縮小する機能です
Dynamic Typeを使うと テキストスタイルのサイズを調整できます テキストが読みやすくなるので アプリケーションでの Dynamic Type対応をご検討ください
システムフォントAPIと テキストスタイルを併用すると― iOSでこの動作が自動的に実現します Dynamic Typeはカスタムフォントにも使えます その方法を紹介しましょう
この表は多くのことを示しています まず拡大縮小の動作は― テキストスタイルによって違います bodyとtitle1とfootnoteを Dynamic Typeで拡大縮小すると こうなります Dynamic Typeをカスタムフォントに使う場合も ここに注意が必要です タイポグラフィーは ブランドの個性を表す重要なものです 多くのアプリケーションは 専用にデザインした カスタムフォントを使うと思いますが― アクセシビリティのため Dynamic Typeへの対応も必要です
iOSシステムアプリケーションと同様に テキストサイズの設定変更に アプリケーションを対応させるには?
これは たびたび出る話題なので 以前のセッションの内容を再び紹介します iOS 11から UIFontMetricsクラスが導入されています このクラスでテキストスタイルの Dynamic Type機能を取得し― 任意のフォントに適用できます
使用例を見てみましょう まず標準のUIFont APIで 通常どおりカスタムフォントを指定します 次にbodyテキストスタイルから UIFontMetricsを作成できます bodyMetricsオブジェクトにより scaledFont APIの生成フォントは― テキストサイズの設定変更時 bodyと同様に拡大縮小します
この方法はカスタムレイアウトの定数値を 拡大縮小するのにも使えます 例えば これはラベル間のスペースの指定です SwiftUIのデベロッパからは リリース以来 多くの反応があり― 今年 SwiftUIでもUIKitと同様の フォントの拡大縮小が可能になりました 例えば このSwiftUIの ContentViewのテキストは― テキストサイズの設定変更に合わせて このように拡大縮小されます
このテキストを“Avenir-Medium”の 34ポイントにしてみましょう 指定したとおりにフォントが適用されました しかしiOS 13では カスタムフォントを使うと― Dynamic Typeに 対応できなくなる問題がありました
iOS 14では この問題は解決しています タイトルとして適切に 拡大縮小されるか確かめるため― relativeToで titleスタイルと 相対的に拡大縮小させてみます
タイトルテキストが 自動的に拡大縮小されています
次は本文テキストを追加します タイトルテキストを追加する時と同様に テキスト段落を宣言し― VStackでTextに割り当てます
relativeToパラメータは不要です iOS 14ではカスタムフォントは― デフォルトでbodyスタイルと 相対的に拡大縮小されます
タイトルも本文も 自動的に拡大縮小されていますね 本文テキストの周囲に パディングが欲しいところです 画面の端とタイトルに近づきすぎています
パディングを追加しましょう 20ポイントの固定サイズを指定してみます
よくなりました パディングもテキストサイズに合わせて 拡大縮小させたいと思います 新しいScaledMetricプロパティラッパーで パディングを値“20”で定義しますが―
bodyスタイルと相対的な拡大縮小も可能です
動作を見てみましょう テキスト周囲のパディングも 固定でなく相対的に拡大縮小しています
今 お話ししたことをまとめましょう font custom APIの新しい任意のパラメータ relativeToで― 拡大縮小の基準とするテキストスタイルを 指定します 指定しなければ bodyが基準になります これはiOS 14での動作変更です 拡大縮小しない固定サイズのカスタムフォントは fixedSizeパラメータで作成できます
UIFontMetricsの時と同じように 定数も拡大縮小するには― ScaledMetricプロパティラッパーを使います いろいろ お話ししましたが 最後に基本原則をお伝えしておきます Appleのシステムフォントは高品質で 幅広いスタイルがあります “SF Pro”“SF Pro Rounded” “SF Mono”“New York”などを― ぜひ使ってみてください
タイポグラフィーに重要な階層の構築には テキストスタイルを活用できます
カスタムフォントを使う場合も 多くの方法でDynamic Typeに対応でき― アクセシビリティに有効です
今日はタイポグラフィーの重要な 要素の話もしました デフォルトのシステム動作から変更するのは 例外的な場合のみとしましょう
インターフェイスで カスタムのトラッキングを使う場合 サイズを限定します 小さいサイズのトラッキングは 大きいサイズに合わないことがあります Appleプラットフォームでの テキストの動作を理解し― テキストとフォントのAPIをアプリケーションの タイポグラフィー向上にご活用ください
-
-
12:19 - Setting custom tracking
// UIKit label.attributedText = NSAttributedString(string: "hamburgefonstiv", attributes: [kCTTrackingAttributeName as NSAttributedString.Key: -0.5]) // SwiftUI Text("hamburgefonstiv").tracking(-0.5)
-
12:45 - Allow tightening to use tight tracking from system fonts
// UIKit: UILabel label.allowsDefaultTighteningForTruncation = true // AppKit: NSTextField textField.allowsDefaultTighteningForTruncation = true // SwiftUI Text("hamburgefonstiv").allowsTightening(true)
-
17:45 - Getting emphasized text styles
// Getting emphasized text styles let label = UILabel() label.text = "Ready. Set. Code." if let descriptor = UIFontDescriptor .preferredFontDescriptor(withTextStyle: .title1) .withSymbolicTraits(.traitBold) { // 28 pt Bold on iOS label.font = .init(descriptor: descriptor, size: 0) }
-
18:05 - Getting emphasized text styles APIs
// Getting emphasized text styles // AppKit let descriptor = NSFontDescriptor .preferredFontDescriptor(forTextStyle: .body) .withSymbolicTraits(.bold) // 13 pt Semibold on macOS let emphasizedBodyFont = NSFont(descriptor: descriptor, size: 0) // UIKit/Catalyst if let descriptor = UIFontDescriptor .preferredFontDescriptor(withTextStyle: .body) .withSymbolicTraits(.traitBold) { // 17 pt Semibold on iOS let emphasizedBodyFont = UIFont(descriptor: descriptor, size: 0) } // SwiftUI let emphasizedFootnoteFont = Font.footnote.bold() // 13 pt Semibold on iOS
-
19:34 - Getting tight leading variant
// Getting tight leading variant import UIKit let label = UILabel() label.text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat." if let descriptor = UIFontDescriptor .preferredFontDescriptor(withTextStyle: .body) .withSymbolicTraits(.traitTightLeading) // 20 pt line height label.font = UIFont(descriptor: descriptor, size: 0) }
-
19:49 - Getting loose leading variant
// Getting tight leading variant import UIKit let label = UILabel() label.text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat." if let descriptor = UIFontDescriptor .preferredFontDescriptor(withTextStyle: .body) .withSymbolicTraits(.traitLooseLeading) // 24 pt line height label.font = UIFont(descriptor: descriptor, size: 0) }
-
20:03 - Getting tight/loose leading variant APIs
// Getting tight/loose leading variant // AppKit let descriptor = NSFontDescriptor.preferredFontDescriptor(forTextStyle: .headline) .withSymbolicTraits(.tightLeading) // Use .looseLeading for loose leading font let tightLeadingFont = NSFont(descriptor: descriptor, size: 0) // 14 pt line height // UIKit/Catalyst if let descriptor = UIFontDescriptor.preferredFontDescriptor(withTextStyle: .title1) .withSymbolicTraits(.traitTightLeading) { // Use .traitLooseLeading for loose leading let tightLeadingFont = UIFont(descriptor: descriptor, size: 0) // 36 pt line height } // SwiftUI // Use .loose for loose leading font let tightLeadingFootnoteFont = Font.footnote.leading(.tight) // 16 pt line height on iOS
-
20:56 - Access rounded system font design
// Access rounded system font design import UIKit let label = UILabel() label.text = "Today" if let descriptor = UIFontDescriptor .preferredFontDescriptor(withTextStyle: .largeTitle) .withSymbolicTraits(.traitBold)? .withDesign(.rounded) { // SF Pro Rounded Bold label.font = UIFont(descriptor: descriptor, size: 0) }
-
21:08 - Access system font designs
// Access system font designs // Use .serif for New York, .monospaced for SF Mono // AppKit let descriptor = NSFontDescriptor.preferredFontDescriptor(forTextStyle: .body) .withDesign(.rounded) let roundedBodyFont = NSFont(descriptor: descriptor, size: 0) // SF Pro Rounded // UIKit/Catalyst if let descriptor = UIFontDescriptor.preferredFontDescriptor(withTextStyle: .body) .withDesign(.rounded) { let roundedBodyFont = UIFont(descriptor: descriptor, size: 0) // SF Pro Rounded } // SwiftUI let roundedBodyFont = Font.system(.body, design: .rounded) // SF Pro Rounded
-
25:05 - Support Dynamic Type with custom font in UIKit
// Support Dynamic Type with custom font in UIKit if let customFont = UIFont(name: "Charter-Roman", size: 17) { let bodyMetrics = UIFontMetrics(forTextStyle: .body) // Charter-Roman scaled relative to body text style // in different content size categories. let customFontScaledLikeBody = bodyMetrics.scaledFont(for: customFont) label.font = customFontScaledLikeBody label.adjustsFontForContentSizeCategory = true // Scaling constant 10 relative to body text style. let scaledValue = bodyMetrics.scaledValue(for: 10) }
-
26:25 - Support Dynamic Type with custom fonts in SwiftUI example
struct ContentView: View { let prose = "Apple provides two type families you can use in your iOS apps. San Francisco (SF). San Francisco is a sans serif type family that includes SF Pro, SF Pro Rounded, SF Mono, SF Compact, and SF Compact Rounded." @ScaledMetric(relativeTo: .body) var padding: CGFloat = 20 var body: some View { VStack { Text("Typography") .font(.custom("Avenir-Medium", size: 34, relativeTo: .title)) Text(prose) .font(.custom("Charter-Roman", size: 17)) .padding(padding) } } }
-
28:29 - Support Dynamic Type with custom fonts in SwiftUI
// Support Dynamic Type with custom fonts in SwiftUI // Text with font Avenir-Roman, scaling relative to title text style. Text("Typography").font(.custom("Avenir-Roman", size: 34, relativeTo: .title)) // Text with font Helvetica, scaling relative to body text style. Text("Title").font(.custom("Helvetica", size: 17)) // Text with font Courier, always use fixed size, do not scale according to user setting. Text("Fixed").font(.custom("Courier", fixedSize: 17)) // Constant 10, scaled relative to title text style. @ScaledMetric(relativeTo: .title) private var spacing: CGFloat = 10.0
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。