Typeモバイル基盤部のヴァンサン(@vincentisambart)です。使っているアプリのフォントサイズを変えたいと思ったことありますか?目があまり良くないから文字を大きくしたい。逆にもっと多くの情報を一目で見られるために文字を少し小さくしたい。Type」と呼ばれる機能があります。Text)で変えられます。対応しているアプリではフォントサイズがその設定に合わせられます。標準より少し小さくできるとはいえ、「アクセシビリティ」設定に入っているのもあって文字を大きくする方がメインのユースケースの気がします。7から使えるようになりましたが、関連している様々な便利機能がその後のiOSバージョンに追加されました。Layoutは必須ではないのですが、手動レイアウトと一緒に使うのはおすすめできません。設定を変える前に、簡単に戻せるようにまずは標準設定を覚えておきましょう。標準設定は以下のスクリーンショットのように「さらに大きな文字」が無効で、下部のスライダーがど真ん中です。スライダーを動かすとフォントサイズがどれくらい変わるのかすぐ見られます。smallまたはXS)にすると、以下のようになります。largeまたはXXXL)にすると以下のようになります。アクセシビリティサイズはXXXLより大きく、「さらに大きな文字」を有効にすると選択できるようになる5つの設定です。large、またはAX5)にすると以下のようになります。Type対応しているアプリでも、アクセシビリティサイズをXXXLと同じ扱いにしているアプリもあります。文字がとても大きいのでレイアウトが崩れやすいからでしょう。8以上では)traitCollection.preferredContentSizeCategoryで取得できます。12)で利用できるすべての値は以下のとおりです。AX5)設定画面で「さらに大きな文字」が有効になっているときだけに選択できるアクセシビリティサイズは名前がaccessibilityから始まります。11以上では、アクセシビリティサイズかどうか確認するためにUIContentSizeCategoryにisAccessibilityCategoryというメソッドがあります。.extraExtraExtraLargeも使えます。categoryの値によって、レイアウトを変えたりできます。Typeの設定画面で大きいアクセシビリティサイズを選ぶ時、「さらに大きな文字」スイッチがラベルの右からその下に移ります。Type設定によってUIStackViewの設定が変わるのでしょう。Typeの設定に合わせてするレイアウト変更は作成時以外、どういうタイミングでやれば良いのでしょうか。Typeの設定を変えるとアプリが終了されるわけではありません。ユーザーがアプリに戻ったら、アプリが変更を知らされる仕組みが2つあります:UIContentSizeCategory.didChangeNotificationというnotificationがアプリに送られます。8以上ではtraitCollectionDidChangeメソッドが呼ばれます。Typeの設定変更に反応できます。ビューコントローラーが表示されていない場合(例えば別のタブが表示されている間)、traitCollectionDidChangeは呼ばれませんが、UIContentSizeCategory.didChangeNotificationは届きます。Typeの「Type」は文字、フォントのことなので、肝心のフォントサイズはどうすれば良いのでしょうか。categoryごとに用意するのは手間が掛かりすぎます。Styleが用意されています。ワードプロセッサーでいうと「書式」と同じ概念です(ただし自分の好みに合わせて変えることができません)。categoryでのフォントサイズが見られます。AX5として紹介されてあります。Francisco)です。そのスタイルはコード上ではUIFont.TextStyleです。11(largeTitle)で少し増えました。スタイルによって変わるのはフォントサイズだけではなく、headlineスタイルの場合、フォントがボルドになります。large設定では、iPadで各スタイルを表示すると以下のようになります。extraExtraExtraLarge設定では、以下のようになります。accessibilityExtraExtraExtraLarge設定では、以下のようになります。この最大サイズでは各スタイルの差があまりないですね。コードでは、UIFont.preferredFont(forTextStyle:)がメインのAPIです。Type設定に合っているbodyスタイルのフォントを返してくれます。Stylesの中で選べます。Typeの設定を変えてアプリに戻ったら、新しい設定が自動的に反映されるわけではありません。viewのフォントを指定し直す必要があります。Builderで指定した場合、コードで再指定することになってしまいます。UITextView)にadjustsFontForContentSizeCategoryというプロパティがあります。Font」と同じです。以下その機能を「自動フォント調整」と呼ぶことにします。Type設定変更後、バックグラウンドにあったアプリに戻るとフォントサイズが自動的に更新されます。metrics、が使われている場合のみに有効です。Font」にチェックを入れた場合、ビルド時に警告が出ます。コードでそのビューのフォントに自動フォント調整が効くフォントを指定したら、ちゃんと動きますがビルド時の警告が残ります。true)のが良いでしょう。カスタムテキストスタイルAPIはシステムフォントしか使えませんし、システムフォントを使うとしても、スタイルの種類が多くありません。テキストスタイルAPIが用意されたスタイルを使う前提で作られたとしても、コードで自分の定義したサイズやフォントを使う方法がなかったわけではありません。考えるだけで以下の2つの方法がすぐ思いつくのでしょう。categoryの分のフォントとサイズを用意します。手間が掛かりますし、スタイルを変えたいときも大変です。categoryに合わせて調整します。Typeに対応している唯一の画面、レシピ詳細では長い間後者を使っています。この2つの方法では、自動フォント調整が使えません。Typeの設定に変更があったときにフォントサイズを調整したければ、「変更に反応」セクションで紹介した方法で変更に反応して各ビューのフォントを再指定します。11以上だと、もう少し楽なAPIが提供されています。Typeの設定に合わせられるだけではなく、自動フォント調整も使えます。使い方は以下のようです。trueもしフォントサイズが大きすぎるとレイアウトが崩れてしまう場合、最大フォントサイズを指定できます。50.0)UIFontMetricsにはフォントだけではなく、画像のサイズを文字の大きさに合わせるためのメソッドもあります。sizeToScale)シンプルですね。Builderでその機能が使えません。Builderで配置しても良いのですが、フォントはコードで指定する必要があります。UIFont.TextStyle)もあります。.body)に初期化されたものです。.caption2)なども使えます。Type設定によってフォントのサイズがどう変わるのかはテキストスタイルごとに少し違うためです。以下の図を見ればもう少し分かるかと思います。図に使われた数値をどう計算したのかあとで説明します。カスタムスタイルごとにサイズの推移をどのシステムスタイルに合わせたいのか決めるのが大変だと思うので、分からない時はUIFontMetrics.defaultを使って良い気がします。上記は説明せずに図を出しましたが、実際サイズがどう計算されるのでしょうか?UIFontMetrics.scaledFont(for:)の返しているフォントの自動フォント調整対応は自分で実装できないかもしれませんが、計算くらいはできるのではないでしょうか。myFontSize).round()に近いです。sizeからではなく、leadingから計算されています。Sizesにある「Leading」にあります。categoryのleadingを標準(large)のleadingで割っただけです。因みにフォントに関して「Leading」は「リーディング」ではなく、「レディング」と読みます。TypographyページにあるLeadingというのは日本語で「行送り」のことです。1行のベースラインから次の行のベースラインまでの距離です。UIFontにあるleadingは違っていて、こっちは「行間」のことです。lineHeightです。いろんな説明よりコードの方が分かりやすいかもしれません。10以上でしか使えませんが、もっと古いiOSバージョンではleadingの値のテーブルをコードに埋め込めば簡単に実装できるしょう。Type)をまとめるものです。Type設定をいちいち変えるのが大変なので、UITraitCollectionを渡すのが良いのですが、ビューのフォントを指定する場合は基本的にUITraitCollectionを渡さず、ユーザーの設定に合うものを求めます。lineHeight)のだと書きましたが、フォントサイズの計算にその比率が使われるから少し不自然な結果になることがあります。Type設定でのbodyのフォントはサイズが少し異なります。そのため、UIFont.preferredFontとUIFontMetrics.scaledFontを同じ画面で混在させない方が良いかもしれません。因みに、今回はその方が分かりやすかったのですが、普段はUIFont.preferredFontの戻り値をUIFontMetrics.scaledFontを渡さないでおきましょう。一応動くのですが、UIFontMetrics.scaledFontの戻り値をまたUIFontMetrics.scaledFontに渡すとObjective-Cの例外が発生します。画像テキストの横に画像があると、その画像をある程度テキストのサイズに合わせたいことがあるかもしれません。11からUIButtonやUIImageViewが準拠しているUIAccessibilityContentSizeCategoryImageAdjustingプロトコルにadjustsImageSizeForAccessibilityContentSizeCategoryというプロパティが登場しました。Size」と同じです。Type設定によってビューの画像が拡大されますが、アクセシビリティサイズが選ばれている場合のみです。他の設定ではサイズが変わりません。サイズ調整で画像が大きくなると荒くなってしまう可能性があります。Data」にチェックを入れたら綺麗に拡大されます。Typeと一緒に使われるように設計されているので、ぜひ紹介記事をご覧ください。既存のアプリは全画面を一気に対応するのは難しいでしょう。1つの画面で対応しているビューとしていないビューが混在すると不自然な表示になりますので、画面単位で対応した方が良い気がします。テーブルのセルの高さはできるだけシステムが自動計算するようにしましょう:estimatedRowHeightの指定を忘れず(指定されないと自動計算が動かないので)、高さ(rowHeight)をUITableView.automaticDimensionにします。rowHeightもestimatedRowHeightもUITableViewのプロパティで指定しても、UITableViewDelegateのメソッドで返しても、どっちでも大丈夫です。Layoutを使ってビューを配置するとき、ベースラインアンカー(firstBaselineAnchorまたはlastBaselineAnchor)に対する縦制約はconstraint(equalToSystemSpacingBelow:multiplier:)(またはlessThanバージョン、greaterThanバージョン)を使うと、制約の高さがフォントのサイズに合わせて変わります。Value」を選ぶのと同じです。Type設定でユーザーが自分の視力や好みに合わせてフォントのサイズを選べますが、アプリ側での対応が必要です。11以上ではだいぶ楽になったのではないでしょうか。多くのユーザーの使いやすさのために対応しているアプリを増やしておきましょう。TypeTweet関連記事2019-06-25SwiftUIで使用されているSwift5.1の新機能こんにちは。参加しましたこんにちは、技術部品質向上グループの加藤です。サービス開発部部長の勝間(@ryo_katsuma)です。使ったセキュリティログ検索基盤の構築サービス特性にあった検索システムの設計戦略クックパッド採用説明会「クックパッドはサービスの作り手を採用したいんです。/*}*/スターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。