ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
Mac Catalyst用のアクセシビリティの設計
Mac Catalyst Appをすべてのものにアクセスできるようにし、その改良を iPad Appに取り込みましょう。優れたアクセシビリティを持つiPad Appが、Mac Catalystのサポートを追加すると自動的に優れたアクセシビリティを持つMac Appになる仕組みをご紹介します。マウスとキーボードのアクションやアクセシビリティエレメントのグループ化とナビゲーションのサポートによってエクスペリエンスをさらに強化する方法をご覧ください。また、Appをテストし、あらゆる人にとって真に優れたエクスペリエンスを創造するためのイテレーションを行う新しいAccessibility Inspectorフィーチャの使用方法もご覧ください。 本セッションの前に、Mac Catalyst、UIKit、およびiOS向けの基本的なアクセシビリティAPIを理解しておくことをお勧めします。まずは“Introducing iPad apps for Mac”と"Auditing your apps for accessibility"をチェックしてください。
リソース
関連ビデオ
WWDC19
-
ダウンロード
こんにちは ようこそWWDCへ “Mac Catalyst用のアクセシビリティの設計” 私はエリックです 後ほど同僚のネイサンも加わり― Mac Catalyst用のアクセシビリティの設計 についてお話します Mac CatalystはAppleにとって 大きな成功となっています 驚くほど簡単に利用でき 開発者たちは本当に気に入っています App StoreにはMac Catalystで作られた 最高のアプリケーションが既にあります すべての顧客がすばらしいアプリケーションを 使えるようにすることが重要です 今日はアクセシビリティについて話します Appleにおいて アクセシビリティは 核となる価値の1つです 身体障害を持つ人々を支援する の支援技術が すべてのプラットフォームに 揃っています アクセシビリティチームは iOSのために実施してきた成果が 確実にMac Catalystに変換されるよう 努めています そのためiOSアプリケーションで アクセシビリティが対応可能な場合 Macでも自動的に 対応できるようになりました つまりMac Catalystの アプリケーションに取り組む際 iOSの観点で 考え続けられるということです 最初に キーボードを使用するために アプリケーションを最適化する方法を説明します フォーカス行動を改善しキーボードの ショートカットを加えます 次に 障害者支援技術のための ナビゲーション効率を向上させるために 何ができるかを簡単に説明します そして最後は Mac Catalystアプリケーション用に macOS上でアクセシビリティを テストするためのヒントです それではキーボードの使い方から 始めましょう macOSのキーボードは iPadOSのように 単なる補助的な役割ではありません むしろユーザがアプリケーションと やり取りするための主な手段です 目標は できるだけ多くの アプリケーションの機能に キーボードでアクセスすることです 最初にできることは キーボードの フォーカスをチェックすることです どのUI要素が 現在キーボードからの 入力を受け付けているのかを特定します そしてユーザがやり取りできる アプリケーションの すべてのUI要素に フォーカスできるかを確かめます 実演するため Roasted Beansと呼ばれる サンプルを見てみます これは昨年アクセシビリティ対応にした Peanut Butterアプリケーションの副産物です Peanut Butterが功を奏した時に 多くの人がピーナッツバタートーストと 一緒に飲むコーヒーを探していました そこでiOSのアプリケーションを立ち上げ アクセシビリティ対応にし終えてから Mac Catalystを使って macOSに対応させたいと考えました このアプリケーションとキーボードを通して その方法を見てみましょう まず最初に コントロールを使った キーボードでのやり取りを可能にする― システム設定をオンにする 必要があります これはシステム環境設定の アプリケーションにあります キーボードの部分の ショートカットメニューの下です “キーボードナビゲーションで コントロール間でフォーカスを移動”を チェックします アプリケーションに戻り tabボタンを押して 何が起こるか見てください ナビゲーションバーの右側にある 追加ボタンの周りに フォーカスの輪がついているのが お分かりでしょう これは追加ボタンに キーボードフォーカスがあることを意味していて スペースバーを押すと そのボタンが有効になります 次にtabを押すと サイドバーの 最初の項目が強調されます ユーザは上下の矢印キーを押して テーブルビューの選択肢を変えることができます
次に続くtabで 残りのやり取り可能な コントロールが強調されます 共有ボタン お気に入りボタン そしてギフトボタンです
すばらしいですね UIKitは既にキーボードで アクセス可能な すべてのコントロールを作っています tabキーでコントロールの間をループし 矢印キーでテーブルビューの中の 選択肢を選びます
今アプリケーション内のどこかに UITableViewか UICollectionViewがあるならば 矢印キーで選択肢を動かせないことに 気づいたかもしれません 矢印キーで選択肢を 変えられるようにするためには この新たなAPIでUITableViewか CollectionViewにて selectionFollowsFocusを trueにするだけです サンプルアプリケーションでは tableViewが UISplitViewのサイドバーであるため UIKitは これをtrueにするので この手順を取る必要はありません
キーボードを更にカスタマイズする方法は サンプルアプリケーションを調べていただき “Mac Catalystの新情報”の セッションをご覧ください これでアプリケーションと やり取り可能なコントロールは すべてフォーカスできることが 分かりました キーボードの使い方に関して 次にできることを説明します キーボードのショートカットの追加です ユーザが今すぐ新しいコーヒーを追加 またはコーヒーを評価したい時は 画面上でクリックするだけで完了します しかし障害者支援技術を 使う人たちにとって 画面上のUIを見つけることは 面倒な場合があります 素早いキーボードショートカットで 動作できたらよいでしょう それでは 友達に焙煎豆を共有する キーボードショートカットを追加してみましょう まずは 使うキーボードのベストな組み合わせを 見つけ出す必要があります 顧客にとってできるだけ直感的に 分かりやすいものにしたいからです 最初によく使われるショートカットについて Appleのガイドラインを確認します アプリケーションに似たような機能があれば そのようなキーボードの組み合わせを 考慮できるでしょう なぜならユーザは既に 慣れているからです 私たちが欲しい“共有”は ここのリストにはありません もう1つの方法は Macの既存のアプリケーションに 似たようなものがあるかどうか チェックすることです そこで みんなが大好きな Mac上のSafariアプリケーションを調べました Safariでは共有のショートカットとして Command Iが使われていました これと同じようにしてみます
最初にAppDelegateにて buildMenu関数を 上書きする必要があります キーボードショートカットに応答する UIKeyCommandを作ることが必要です タイトルとして ローカライズされた 文字列を割り当てます これはメニューバー上に現れます それからそのコマンドをきっかけにする アクションを割り当てます キーボードショートカットに応答する UIKeyCommandを作ることが必要です タイトルとして ローカライズされた 文字列を割り当てます それからそのコマンドをきっかけにする アクションを割り当てます そしてmodifierFlagsコマンドのため 入力を“I”の文字に設定します それからメニューの子としてのみ shareCommandをとるUIMenuを作ります そしてメニューバーの適当な場所に この新たなメニュー項目を挿入します このデモでは 編集メニューの終わりに挿入します 今 編集メニューを開くと 新しいキーボードショートカットの共有が 編集メニューの下にうまく現れ Command Iを押すことでアクセスできます
Mac Catalyst向けに最適化している すべてのすばらしい成果が iOS上でのフルキーボードアクセスも 最適化することを忘れないでください それがユーザがキーボードだけで デバイスを使えるようになるという特徴です 加えてアプリケーションはiOS 13.4で始まった UIPressオブジェクトから 正確なkeyCodeを得ることができます これはゲームを開発するのに便利です なぜならこのAPIで キーボードの フルコントロールが可能になるからです サンプルアプリケーションも 忘れずに調べてください 要約すると キーボード用に設計された すばらしいアプリケーションは アクセシビリティ用の すばらしいアプリケーションだということです 重要なのは やり取り可能なコントロールが キーボードフォーカスで アクセス可能かを確かめることです そして便利なキーボードショートカットを アプリケーションに追加することをお勧めします
キーボードの使い方については以上です 続いては同僚のネイサンが 障害者支援技術のためのナビゲーション効率を 改善する方法についてお話します
ありがとう エリック アクセシビリティチームの ソフトウェアエンジニアのネイサンです 私たちはmacOSの障害者支援技術が あなたのCatalystアプリケーションと やり取りする方法を改善できるよう 努めています 前にも触れましたが アクセシビリティを 対応させるということは 誰もがアプリケーションを 使えるということです アプリケーションを 使えるということは ユーザが効率的にコンテンツに アクセスできるということです 今日はVoiceOverに 焦点を当てましょう これはすべてのプラットフォーム上にある 画面読み上げ機能です コンテンツを読み上げることによって 低視力や視力を失っているユーザが アプリケーションを使うことができます VoiceOverはユーザインタフェースに基づく アクセシビリティ要素のツリーを通して 実現されます macOS上の追加画面で 大きなユーザインタフェースで もっと複雑なアプリケーションを 提供する場合があるかもしれません より複雑なインタフェースは VoiceOverが 伝えるべきアクセシビリティ要素が増えます ユーザを困惑させないために 効果的な方法が必要です そこで今日はアクセシビリティグループに ついてお話しします これはVoiceOverユーザに向けた ナビゲーションを改善するための戦略です グループ化によって より自然なmacOS体験を 提供できるようになりました しかしナビゲーションの 効率性について話す前に VoiceOverがあなたのアプリケーションを どう認識しているかを理解しましょう これはVoiceOverがアプリケーションを 認識する方法です アクセシビリティのツリーと呼んでいます すべての障害者支援技術により 見える要素を集めたものです アクセシビリティ要素であるビューは isAccessibilityElementプロパティにより 決定されます 各要素は 葉のノードで結果として 単一レベルのツリーの要素になっています このモデルがiOSでは うまく機能しています ユーザはタッチスクリーンで 見て回ります つまり画面のタップで 要素を1つ1つ見て行くか 要素に素早く ジャンプすることができます しかしmacOSでは VoiceOverユーザは キーボードを使います タッチスクリーンがないと 要素間を 素早くジャンプすることはできません そのため同じモデルを使おうとすると すべてのアクセシビリティ要素を1つ1つ 見て回らなければなりません この課題を説明するため Roasted Beansアプリケーションで アクセシビリティ要素を見てみましょう ここに 目に見えるアクセシビリティ要素が 26個あることが分かります すなわちユーザはどんな時でも 最低26個の要素を見る必要があります Xcodeでコンパイルボタンにたどり着くまで 26回キーを叩くのです 恐らくプログラミングが かなり大変でしょう キーボードショートカットを1つ加えると 要素を見て回ることが不要になる一方で すべてのユースケースが 解決されるわけではありません それではこれを改善するには 何ができるでしょうか? ディナーメニューを見てみましょう 長いリストを載せたメニューの代わりに 関連した区分ごとに サラダ メインコース 付け合わせ料理と 分けられています これならばVoiceOverユーザは グループの個々の要素を見て回る前に グループ間を見て回ることができます 同じ考えをアクセシビリティのツリーに 適用できます アクセシビリティコンテナを使うことで 要素間の関係を定義できます 1つの要素にaccessibilityContainerTypeを 設定すると そこに含まれるアクセシビリティ要素に よりよいナビゲーション体験を提供するため 障害者支援技術は その情報を使えるようになります アクセシビリティコンテナAPIが iOSユーザに対し どう役立つのかを 既にご存知かもしれません 例えばタッチジェスチャーで 次のコンテナの中の 最初のアクセシビリティ要素を 見に行くことができます VoiceOverはこのような要素に 焦点を当てます
ここでの目標はMac Catalystの ナビゲーション効率を改善することです macOS上のVoiceOverは 同じAPIを活用しますが動作を適応させます macOS上のアクセシビリティコンテナは 1つのアクセシビリティ要素として動作します これはVoiceOverがコンテナ自身への フォーカスをナビゲートできるということです ここからユーザはコンテナを超えて飛び 次の要素に行くか コンテナのアクセシビリティ要素の 独占的なナビゲーションを許して コンテナとやり取りするかを選べます そのためアクセシビリティコンテナが アクセシビリティ要素として動作するというのは Mac Catalystアプリケーション用の アクセシビリティツリーを作ると コンテナが自身のノードを ツリー上に作るからです そしてアクセシビリティ要素が その自身のサブツリーになるのです この構造はAppKitを中心にして築かれた アクセシビリティAPIと密接に一致しています そのモデルは見て回る必要のある アクセシビリティ要素の数を著しく減らすので macOSではうまく機能します
ここで重要なことは アクセシビリティコンテナが Mac Catalyst上での アクセシビリティ要素であることです そのためコンテナ上の アクセシビリティラベルのような 標準のアクセシビリティプロパティを 必ず設定します Roasted Beansアプリケーションに戻ります では アクセシビリティコンテナが アクセシビリティツリーの中の 独立したノードとして動作するとしたら 何が分かりますか?
劇的な効率性の改善が見られます これにより 見えている要素の数が 26個から8個に減ります ナビゲーションする上での アクセシビリティコンテナの影響力を見たので 違うタイプとそれを使うタイミングについて 少し説明しましょう dataTableはグラフのようなコンテナが UIAccessibilityContainerDataTable プロトコルを採用する時のためのものです Listは順序付けられたコンテンツです これはWebページやPDFの目次などで 主として使われます Landmarkは特にWebページとtvOSで 使われるコンテナです 最後にsemanticGroupは iOS上の一般的なコンテナ型です iOSではVoiceOverユーザが 最初に そのコンテナの中の要素にフォーカスした時に アクセシビリティラベルが読まれます macOSではVoiceOverがそのコンテナ自身に フォーカスした時にそのラベルが読まれます
この場合ではナビゲーション体験を改善するため semanticGroup方を使いたいと思います グループ分けでナビゲーション体験は 大いに改善できます 多すぎるグループ分けはアプリケーションの ナビゲーションを必要以上に複雑にします 各アクセシビリティコンテナは アクセシビリティツリーのノードなので VoiceOverユーザが明示的に グループとやり取りしなければ コンテナ内の要素は発見できません ではいくつか例を見て 要素をグループ分けする タイミングを確認しましょう まず初めに同じ機能部分に属している要素は グループ分けすべきです しかしこれらの機能部分を どのように見つけるのでしょう?
最近のMac Catalystアプリケーションの1つ Swift Playgroundsを見てみましょう コードの書き方を勉強し始めたばかりの 友人がいるとします 友人はSwift Playgroundsの 最初のレッスンの問題で行き詰まりました しかし幸運なことに あなたに電話をかけることができます 友人との電話の会話を 想像してください どうやって友人をナビゲートしますか? こう尋ねるかもしれません “左側に章のリストが見える?” “どの章で 君のキャラクターであるバイト君は どのタイルに立っているの?” またはコードの書き方を 教えるかもしれません この場合 真ん中を2つの 機能グループに分けることができます 上側はコードを書くためのエディターで 下側にはオートコンプリートの提案です アプリケーションを 口頭で説明することにより 1つのアクセシビリティコンテナに置くべき 機能部分を簡単に割り出すことができます アクセシビリティコンテナを使う タイミングについての別の事例は 型や機能目的に関連する場合です 例えば UINavigationBar や UITabBar UICollectionView や UITableView は デフォルト設定でsemanticGroup型の アクセシビリティコンテナである― 一部の標準UIKitビューです タブバーやナビゲーションバーとして動作する 自身のカスタムUI要素を作ったならば アクセシビリティコンテナとして 設定することで予想される― デフォルトの動作に従ってください さて Roasted Beans アプリケーションの例に移り ナビゲーション体験をいかに簡単に 改善できるか見てみましょう 左のUITableViewから始めます デフォルト設定でsemanticGroup型の アクセシビリティコンテナです アクセシビリティコンテナは Mac Catalystアプリケーションにとって 独立したアクセシビリティ要素です つまり 他のアクセシビリティ要素と同じく そのコンテナにローカルの アクセシビリティラベルをつけてください この場合には “コーヒーリスト”が適切でしょう UITableViewは選択されたコーヒーについて その状態を保持するため 選択されたコーヒーをラベルに追加することで ラベルを更によくすることができます ここで すばらしいアクセシビリティラベルを 加えることの重要性を思い出してください よいアクセシビリティラベルを作るために 2019年のプレゼンをお勧めします 私たちのアプリケーションに戻ります 右の詳細なビューはどうでしょうか? 選んだコーヒーに関連するすべての 情報を示している機能です 詳細ビューはまだグループ化されておらず UITableView や UICollectionViewを 使っていないので 手動でアクセシビリティコンテナを 定義しなければなりません 今日はアベイラビリティUIで それをいかに 簡単にコンテナにできるかをお見せします 私たちは縦のUIStackViewの中で UILabelsの並びとして実装しました これはユーザが各要素を見て回らなければ ならないことを意味しています アクセシビリティコンテナを加えることで ナビゲーションをよりよくすることができました そしてVoiceOverユーザは全体のリストを 素早く見て回ることができます
ここから 数行だけでUIStackViewを アクセシビリティコンテナにし グループを示すアクセシビリティラベルを そこに与えることができます
これらはアプリケーションに対する すばらしい改善です 関連要素をグループに置くことで Mac Catalystアプリケーションを 見て回る方法を大幅に改善できます ご自身のアプリケーションに対しても アクセシビリティコンテナを加えるという 重要性を忘れないでください それはmacOSとiOS上でのナビゲーションを 大幅に改善できる小さな変更なのです あなたのアクセシビリティコンテナが グループを示す簡潔なローカルのラベルを持ち コンテナの状態に関する 重要な詳細を含めるようにしてください
ナビゲーションの効率性に関して 私が話すことは以上です この後はエリックが アクセシビリティに関して Mac Catalystアプリケーションを テストする方法をお見せします ありがとう ネイサン アクセシビリティに関したアプリケーションを 改善するためのすばらしい成果に対する macOSプラットフォーム上での テストについてお話しします アプリケーションを iOSからMac移行する際 内部からはiOSのアプリケーションだと 見なします しかし外部ではmacOSプラットフォーム上で 動いているため Macのアプリケーションだと考えます するとUIKitからのアクセシビリティAPIで 作業をする時 私たちがiOSのアクセシビリティコードを macOSへ自動的に変換します そのためiOSのことを 考え続けることができます 内部で起こっていることを もっと理解していただくため Mac Catalystアプリケーションのための アクセシビリティインスペクターを改良しました では macOSで走らせた時の iOS APIをお見せします 以前にアクセシビリティインスペクターを 使ったことがなければ 2つのビデオをぜひご覧ください “アクセシビリティのための アプリケーション監査”と “アクセシビリティインスペクター”です これはアクセシビリティインスペクターが どう役立つかについての完全ガイドです すべてのAppleのプラットフォームにわたり アクセシビリティの問題を見つけて 解決するための助けになります では アクセシビリティインスペクターを使い Mac Catalyst上での あなたのアプリケーションの アクセシビリティを監査してみましょう セルの要素を調べるために インスペクターを使えば その要素がコーヒーのタイトルを示す 適切なラベルを持っているか また 評価を示す適切な値を 持っているかが分かります またiOSからのアクセシビリティの特徴や コンテナタイプを示す新たな Catalystの項があることも分かります もしCommand Control Upを使うなら インスペクターは コンテナとして 役目を果たすセル要素の親を調べます 要素のクラスをチェックし 調べるべき正しい要素かを確かめられます この場合 クラス名がtableViewクラスに 変換された要素であることを示しています UIKitからのすべてのクラスは 次第に Macプラットフォームの要素に変換されます 加えてインスペクターはそのビューの ビューコントローラがあることを伝えてくれます この場合 それはアプリケーションからの RBListViewControllerです VoiceOverがコンテナを 読むことを確かめるため tableViewコンテナが ローカルのコーヒーリストである― 適切なラベルを持っているか 確かめることができます またsemanticGroupという 正しいコンテナ型を持っています
そして今年から アクセシビリティインスペクターは すべての要素のために オートメーション型を伝えてくれます この場合 それはテーブルなので XCUIテストでそれがどう見つかるか 正確に分かります これがMac Catalystアプリケーションのために アクセシビリティインスペクターでできる いくつかの追加事項に関する概要でした 楽しんでいただけたと思います
Mac Catalystのアクセシビリティについて 今日は多くのことを取り上げました まとめると アクセシビリティにとって キーボードアプリケーションが 優れていることを説明しました そのためにキーボードフォーカスと キーボードショートカットを追加し コントロールを アクセシビリティ対応可能にしました
それからMac Catalystアプリケーションへの 障害者支援技術に関する ナビゲーションの効率性の 改善についてお伝えしました 既存のiOS APIの accessibilityContainerTypeが Macに与える大きなインパクトと アプリケーションへの採用について話しました そして最後のアドバイスは アクセシビリティインスペクターを使うことです これは私たちが開発者の助けとなるように 開発したすばらしいツールです それではご参加いただき ありがとうございました このプレゼンが Mac Catalystアプリケーションにおいて よりよいアクセシビリティ体験を 作り出す助けになることを願っています
-
-
4:11 - Ensuring selection automatically triggers when focus moves to a different cell
myTableView.selectionFollowsFocus = true
-
6:01 - Creating a keyboard shortcut
extension AppDelegate { override func buildMenu(with builder: UIMenuBuilder) { super.buildMenu(with: builder) let shareCommand = UIKeyCommand(title: NSLocalizedString("Share", comment: ""), action: #selector(Self.handleShareMenuAction), input: "I", modifierFlags: [.command]) let shareMenu = UIMenu(title: "", identifier: UIMenu.Identifier("com.example.apple-samplecode.RoastedBeans.share"), options: .displayInline, children: [shareCommand]) builder.insertChild(shareMenu, atEndOfMenu: .edit) } @objc func handleShareMenuAction() { } }
-
7:20 - Responding to raw key codes
extension MyViewController { override func pressesBegan(_ presses: Set<UIPress>, with event: UIPressesEvent?) { switch presses.first?.key?.keyCode { case .keyboardLeftGUI: // Handle command key pressed case .keyboardB: // Handle B key pressed default: } } }
-
15:45 - Adding accessibility labels to containers, such as UITableView and UICollectionView
tableView.accessibilityLabel = NSLocalizedString("Coffee list", comment: "")
-
15:50 - Making great accessibility labels that include state
extension RBListViewController { override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let data = tableData[indexPath.row] let label = NSLocalizedString("Coffee list", comment: "") let selectedLabel = NSLocalizedString("%@ selected", comment: "") tableView.accessibilityLabel = label + ", " + String(format: selectedLabel, data.coffee.brand) } }
-
16:45 - Adding accessibility containers to improve the navigation experience
let stackView = UIStackView() stackView.axis = .vertical stackView.translatesAutoresizingMaskIntoConstraints = false let locationsAvailable = viewModel.locationsAvailable let titleLabel = UILabel() titleLabel.font = UIFont.preferredFont(forTextStyle: .body).bold() titleLabel.text = NSLocalizedString("Availability: ", comment: "") stackView.addArrangedSubview(titleLabel) for location in locationsAvailable { let label = UILabel() label.font = UIFont.preferredFont(forTextStyle: .body) label.text = "• " + location label.accessibilityLabel = location stackView.addArrangedSubview(label) } stackView.accessibilityLabel = String(format: NSLocalizedString("Available at %@ locations", comment: ""), String(locationsAvailable.count)) stackView.accessibilityContainerType = .semanticGroup
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。