ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
Appを視覚的にアクセシブルにする
アクセシビリティを考慮にいれたデザインをすると、Appを使う人全員にパワーを与えることができます。Appに適応性の高いインターフェースを作り、思慮深いアプローチから色を選び、読みやすいテキストを提供し、全体に優れた体験を提供できるような視覚的設定を採用する方法をお伝えします。 このセッションは、ユーザーインターフェースを作るような気持ちでデザインしました。つまり、誰にでもアクセシブルです。アクセシビリティとデザインをもっと知りたい場合は、"Visual Design and Accessibility"、"Accessibility Inspector"、"Building Apps with Dynamic Type"、"Introducing SF Symbols"をご覧いただけます。
リソース
関連ビデオ
WWDC23
WWDC21
WWDC19
-
ダウンロード
こんにちは WWDCへようこそ “アプリケーションを 視覚的にアクセシブルにする” アクセシビリティチームのエンジニアを務める ドゥルー・ハースです 本日は アプリを 視覚的に利用可能にする方法をお伝えします “視覚アクセシビリティ”と言えば iOS内蔵のVoiceOverが代表的ですね 画面上の項目を読み上げてくれるため ユーザーは画面を見ずに デバイスを操作することができます しかし 視覚アクセシビリティには 他にも種類があります
視力喪失には さまざまな程度があり 人によって経験する症状に違いがあります 完全に見える人もいれば 弱視や盲目の人などもいます その他にも 色覚異常や光感受性など 多くの症状が存在するのです 視力喪失の程度は人によって異なるので 各自に合ったカスタマイズができるよう iOSは幅広い設定を用意しています 私のヒントを参考にしていただければ 皆さんのアプリで すべての人が 視覚体験を楽しめるようになります まず アプリで色やシェイプを活用し ブランディングを行う方法をご紹介します 次にテキストの“読みやすさ”について ご説明します アプリでレイアウト変更などを行えば 万人にとって読みやすいテキストを作成できます また アクセシビリティ設定で 表示設定を変更しアプリの外観を変えられます では アプリを 視覚的に利用可能にする方法をお伝えします 例えば あなたがアプリを作る際 あるUI要素を目立たせたいとします 色を使って強調するのも手ですが 色だけに頼りたくはありませんよね 色覚異常や低視力の人は 色だけでは 強調された部分を判別しにくいためです そのため 優れたデザインにするためには シェイプを使うとよいでしょう Apple ArcadeにSneaky Sasquatchという ゲームがあります App Storeでは ボタンに青色を使用し 強調のためにシェイプを使う場合もあります
例えば“START PLAYING”ボタンは 色やシェイプが施されており― ユーザーも標準のラベルではないと分かります 実際 私はこのデザインを見て 興味を抱き 引きつけられました 他の例もご紹介します 使用中のタブを示すため 色のみが使われていますが 設定でボタンの形を変更すれば 更なる可視化を実現できます Button Shapes設定がオンの時に ボタンをより目立たせたい場合は iOS 14に搭載される新たなAPIをご利用ください ボタンの形をデフォルト設定に 適用できない場合は Button Shapes設定を有効にし 別の外観を用意しましょう 設定を確認するには UIAccessibilityで buttonShapesEnabledを呼び出します または buttonShapesEnabled StatusDidChangeNotificationを監視し この設定が変更された際 アプリの実行中に あるコードを実行します 昨年 iOS 13に追加された新しいAPIの Differentiate without Colorでは ボタン以外でも表示の差別化ができます こうしたデザインは ステータスアイコンや特徴的な色のテキスト― また 色だけに頼っている表示にも 適応すべきです どこから始めるべきか不明な場合は SF Symbolsをお試しください 1500個以上のシンボルを 皆さんの作るアプリにお使いいただけます この中から ぴったり合うものが 見つからなければ SF Symbolsのアイコンを元に 独自のシンボルを作成できます
SF Symbolsはウエイトやスケールを問わずに 見栄えがよく 非常に効果的です つまり テキストサイズやスタイルに合った シンボルを作ることも可能なのです 私自身は色とシェイプを使った 視覚的なUIの設計を始めたところです 星座追跡アプリ Starstruckの作成に取り組んでいます 視覚アクセシビリティ対応を検討する時期は 開発の初期段階がベストですが 後で取り掛かっても大丈夫です 私は黄道十二星座に それぞれ色を設定して区別をつけていますが 色覚異常の方は 色を判別できないでしょう 各項目を目立たせるためには 色だけでは不十分だと気づき アプリ内で使用する独自のシンボルを設計し 各星座に区別をつけました 色とシェイプを活用したのです この結果 より多くの方に アプリを楽しんでもらえるようになりました
他に 太字のテキストも使いましたが この点については後で説明します アプリで色を使用する場合は 色の対比が 読みやすさに大きく影響するため 対比の度合いによっては 各要素を識別できない場合もあります Increase Contrastのアクセシビリティ設定では 色の対比を強調し 各要素を目立たせます iOSが提供する幅広い種類のシステムカラーは Increase Contrastの設定などに自動適用されます アプリの視覚体験を向上させる際に 必要となる設定なので覚えておいてください 原則として 色はライトモードでより暗くなり ダークモードではより明るくなります 分かりやすいように例を挙げて説明します デフォルトの設定では 星座のシンボルに 私が作成した色を使用しています しかし Increase Contrastをオンにしている場合 もう少し暗い色が必要になります では Increase Contrastを有効にするので 各セルのシンボルをよく見ていてください 行きますよ
どうですか このわずかな変化こそが非常に重要なのです 人によっては これでコントラストが高まり 見え方が大きく変わるでしょう こうしたカスタムカラーとシンボルを アプリで使用している方もいますよね その場合はティントカラーを更新するか ハイコントラストの外観用に 代わりのアセットを提供する必要があります
プロジェクトのアセットカタログでは Attributes Inspectorで変更を行い シンボルの外観を設定できます “Appearances”で“High Contrast”の チェックボックスを選択すると お使いのシンボルの別バージョンが現れます
Increase Contrastがオンの場合 High Contrastの外観が適用されます XcodeのAccessibility Inspectorには 便利なColor Contrast Calculatorがあります このツールを使えば 2つの色のコントラストを計算できます それでは 最前面にある白いシンボルと 背景にある紫色のシンボルの コントラストを計算してみます 4.5対1という比率でしたが これは許容できるギリギリの比率です では ハイコントラストの外観にしてみましょう シンボルがポップになるように 背景色をより暗くしたので 比率は大幅に改善され 7.5対1になりました
これらのバリエーションを用意できたので 作業は完了です iOSでは ユーザーの表示設定に基づき これらを自動的に切り替えます また Smart Invert Colorsは ダークモードに似た機能で 明るい白色のUI要素を暗くします Smart Invert Colorsでは ダークモードよりも コントラストが高くなるため 光感受性者はこちらを好むでしょう 推奨はアプリ側のダークモード対応ですが Smart Invert Colorsは アプリUIを反転表示する設定です Smart Invert Colorsを好む ユーザーもいるでしょう 写真やビデオ アプリのアイコンなどは 反転されないようフラグを付けてください UIViewサブクラスでaccessibilityIgnores InvertColorsを設定すれば完了です
色とシェイプでデザインを際立たせる方法は いろいろあります それがアプリのブランディングになりますし また同時に 豊かな視覚体験も実現するのです デザインがユーザーのニーズに即しているか 常に確認し対応しましょう 次は テキストの読みやすさについてです
iOSでは デバイス上で テキストサイズが変更できます 小さいテキストはコンテンツの密度を 上げることができますし 大きなテキストは読みやすくなります より大きなテキストが 必要なユーザーも存在します
アプリデザインでは 文字をくっきりと 読みやすくするよう留意しましょう この点をデザインの初期段階に意識してください 見やすいアプリになります コンテンツの量だけでなく 各種の画面サイズにも合わせられます 大きなテキストで設計しましょう 文章量が増えても 切り詰めるのは避けたいもの 情報が見逃されてしまいます 代わりにラベルを付け 表示幅を使いきりましょう
先にお話ししたシンボルも テキストサイズに合わせます traitCollectionDidChangeは オーバーライドでき 画面上で表示が調整されると 呼び出されます UITraitCollectionは デバイスごとの推奨サイズを表示します そして 比較演算子で この列挙型上の比較ができます 私のお気に入りの機能です Starstruckで ユーザーが テキストサイズを変更したら 規定値なのか より大きくしたのかを 把握したいですよね 既定サイズの場合 シンボルとラベルを含む スタックビューは 水平軸上に中央揃えで設定されます 大きな文字の場合は 垂直軸上で行頭揃えを選択します これで ディスプレイの幅を最大限利用した ラベル表示ができます ラベルの行カウントは 1でなく0にしておきます すると 長くなっても折り返せますからね
読みやすさのためには 太字も有効とお伝えしました 太字は ラベルがシンボルと 並んでいる時だけでなく 他のテキストと並んでいる時にも有効です Starstruckのユーザーは 星のデータに夢中になります このように 太字を使って 見出しと詳細情報を視覚的に区別しています 太字で強調する技は使えますよ システムに組み込まれた フォントスタイルを使えば テキストのウェート変更はとても簡単です
Bold Text設定は すべてのテキストに太字を適用します 既定の細いフォントは 読みにくい場合もあります Bold Text設定の効果が うまく反映されない場合は UIAccessibilityでBoldTextEnabledを 呼び出し 手動で更新します 最後に アプリの外観を変える 他の表示設定をご紹介します
私のアプリでは 星座表示画面に 視差効果を設定しました 視差効果は UIMotionEffectで 手前にある星の画像と 背景の宇宙の画像の間に 奥行き感を作ります デバイスを動かすと 星の画像が背景に対してズレて動きます 視差効果は ホーム画面でおなじみですね この効果は楽しいものですが 乗り物酔いのような状態になる人もいます そうした画面の動きに敏感な人向けの 表示設定機能があります ユーザーは この機能を使って 画面上の動きを調整できます アイドルアニメーションや 視差効果などの動作の抑制 動画の自動再生やGIFも制御できます 視覚効果は アプリ体験をリッチにしてくれます 一方で 表示調整機能が必要なユーザーへの 配慮は必須です 動きの激しいアニメーションを使っているなら UIAccessibilityでisReduceMotionEnabledを 設定しましょう reduceMotionStatusDidChangeNotificationでは 設定変更を確認できます
その中のPreferCrossFadeTransitions について説明します ナビゲーションコントローラでは push segueが実行され 画面はかぶさるように遷移します PreferCrossFadeTransitionは その動きを控えめにします あなたにもできますよ iOS 14では この機能の設定用に 新しいAPIを用意しています UINavigationController利用者には 無償提供されます カスタムの遷移動作には このAPIが役立つでしょう この機能が必要か確認するには prefersCrossFadeTransitionsを呼び出すか 通知を確認します 最後は Reduced Transparency設定です ぼやけた背景を不透明にする機能です この機能は文字を読みやすくします ぼやけた背景では コントラストが乱れ 可読性が下がるのです 私のアプリでは 星の情報画面の背景に ぼかし効果を取り入れました 没入感は出せましたが すべての人に適切とは言えません 背景のコントラストを乱す場合もあります そこに文字が重なると めまいを覚えるユーザーもいるでしょう Reduced Transparencyは ぼかしの濃淡を均一に調整します ずっと読みやすくなりますね ぼかしなどの視覚効果を使用していない場合 Reduced Transparencyの 設定確認用APIが無償提供されています これらの表示設定で あなたのアプリの見え方は改善されます これはとても重要です ユーザーを限定しないアプリの提供は お客様の可能性を広げるからです 誰にも使いやすい アプリ開発の努力に感謝します さあ アクセシビリティ設定画面を開いて ご紹介した設定をオンにしてください アプリの外観の変化を確認できます 見栄えが良くなっていますよね 次に取り組むべき課題も 見えてきたのではないでしょうか ご清聴に感謝します
-
-
3:14 - Button Shapes
func observeButtonShapesNotification() { // Make buttons more visible by using shapes. // If your default design does not include button shapes, observe this notification to make visual changes. NotificationCenter.default.addObserver(self, selector: #selector(updateButtonShapes), name: UIAccessibility.buttonShapesEnabledStatusDidChangeNotification, object: nil) } @objc func updateButtonShapes() { if UIAccessibility.buttonShapesEnabled { // Use extra visualizations for buttons. } else { // Use default design for buttons. } }
-
3:31 - Differentiate Without Color
func observeDifferentiateWithoutColorNotification() { // Use symbols or shapes to convey meaning instead of relying on color alone. // If your default design does not differentiate without color, observe this notification to make visual changes. NotificationCenter.default.addObserver(self, selector: #selector(updateColorAndSymbols), name: NSNotification.Name(UIAccessibility.differentiateWithoutColorDidChangeNotification), object: nil) } @objc func updateColorAndSymbols() { if UIAccessibility.shouldDifferentiateWithoutColor { // Use symbols or shapes to convey meaning. } else { // Use default design. } }
-
7:47 - Smart Invert Colors
extension UIView { @available(iOS 11.0, tvOS 11.0) var accessibilityIgnoresInvertColors: Bool { get set } }
-
9:57 - Large Text
// ZodiacConstellationCell.swift override func traitCollectionDidChange (_ previousTraitCollection: UITraitCollection?) { if (traitCollection.preferredContentSizeCategory < .accessibilityMedium) { // Default font sizes stackView.axis = .horizontal stackView.alignment = .center } else { // Accessibility font sizes stackView.axis = .vertical stackView.alignment = .leading } }
-
11:33 - Bold Text
func observeBoldTextNotification() { // Update labels to use bold or heavy font styles. // If you aren't using system font styles, observe this notification to make visual changes. NotificationCenter.default.addObserver(self, selector: #selector(updateLabelWeight), name: UIAccessibility.boldTextStatusDidChangeNotification, object: nil) } @objc func updateLabelWeight() { if UIAccessibility.isBoldTextEnabled { // Use bold or heavy font weight } else { // Use font weight that is default to your design. } }
-
13:08 - Reduce Motion
func observeReduceMotionNotification() { // Observe this notification to reduce or remove the frequency and intensity of motion effects. NotificationCenter.default.addObserver(self, selector: #selector(updateMotionEffects), name: UIAccessibility.reduceMotionStatusDidChangeNotification, object: nil) } @objc func updateMotionEffects() { if UIAccessibility.isReduceMotionEnabled { // Reduce or remove extraneous motion effects. } else { // Use default motion effects. } }
-
13:51 - Prefers Cross-fade Transitions
func observeCrossFadeTransitionsNotification() { // Reduce or remove sliding animations for transitioning views. // If you aren't using system-provided navigation, observe this notification to make visual changes. NotificationCenter.default.addObserver(self, selector: #selector(updateTransitionEffects), name: UIAccessibility.prefersCrossFadeTransitionsStatusDidChange, object: nil) } @objc func updateTransitionEffects() { if UIAccessibility.prefersCrossFadeTransitions { // Replace sliding transitions with cross-fade animations. } else { // Use default sliding transitions. } }
-
15:07 - Reduce Transparency
func observeReduceTransparencyNotification() { // Reduce or remove transparency by adjusting these effects to be completely opaque. // If you aren't using system-provided visual effects for blurs or vibrancy, observe this notification to make visual changes. NotificationCenter.default.addObserver(self, selector: #selector(updateTransparencyEffects), name: UIAccessibility.reduceTransparencyStatusDidChangeNotification, object: nil) } @objc func updateTransparencyEffects() { if UIAccessibility.isReduceTransparencyEnabled { // Make transparency effects opaque. } else { // Use default transparency. } }
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。