View in English

  • Apple Developer
    • 今すぐ始める

    「今すぐ始める」を詳しく見る

    • 概要
    • 学ぶ
    • Apple Developer Program

    最新情報

    • 最新ニュース
    • Hello Developer
    • プラットフォーム

    プラットフォームを詳しく見る

    • Appleプラットフォーム
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    • App Store

    特集

    • デザイン
    • 配信
    • ゲーム
    • アクセサリ
    • Web
    • Home
    • CarPlay
    • テクノロジー

    テクノロジーを詳しく見る

    • 概要
    • Xcode
    • Swift
    • SwiftUI

    特集

    • アクセシビリティ
    • App Intent
    • Apple Intelligence
    • ゲーム
    • 機械学習とAI
    • セキュリティ
    • Xcode Cloud
    • コミュニティ

    コミュニティを詳しく見る

    • 概要
    • 「Appleに相談」イベント
    • コミュニティによるイベント
    • デベロッパフォーラム
    • オープンソース

    特集

    • WWDC
    • Swift Student Challenge
    • デベロッパストーリー
    • App Store Awards
    • Apple Design Awards
    • Apple Developer Center
    • ドキュメント

    ドキュメントを詳しく見る

    • ドキュメントライブラリ
    • テクノロジー概要
    • サンプルコード
    • ヒューマンインターフェイスガイドライン
    • ビデオ

    リリースノート

    • 注目のアップデート
    • iOS
    • iPadOS
    • macOS
    • watchOS
    • visionOS
    • tvOS
    • Xcode
    • ダウンロード

    ダウンロードを詳しく見る

    • すべてのダウンロード
    • オペレーティングシステム
    • アプリ
    • デザインリソース

    特集

    • Xcode
    • TestFlight
    • フォント
    • SF Symbols
    • Icon Composer
    • サポート

    サポートを詳しく見る

    • 概要
    • ヘルプガイド
    • デベロッパフォーラム
    • フィードバックアシスタント
    • お問い合わせ

    特集

    • アカウントヘルプ
    • App Reviewガイドライン
    • App Store Connectヘルプ
    • 近日導入予定の要件
    • 契約およびガイドライン
    • システムステータス
  • クイックリンク

    • イベント
    • ニュース
    • Forum
    • サンプルコード
    • ビデオ
 

ビデオ

メニューを開く メニューを閉じる
  • コレクション
  • すべてのビデオ
  • 利用方法

その他のビデオ

  • 概要
  • Summary
  • トランスクリプト
  • コード
  • カスタムコントロールのアクセシビリティの向上

    あらゆるユーザーが利用できるようにすることで、アプリのインタラクティブ要素の可能性を最大限に引き出すことができます。VoiceOverやその他の支援技術が、ユーザーによるコントロールの理解と操作をどのようにサポートするかについての詳しい解説を通じ、アクションやパススルージェスチャ、直接のタッチなど多様な入力方法を確認します。また、サンプルのコントロールをいくつかお見せして、それぞれをより洗練させてアクセシビリティ体験を向上させる方法を詳細に説明します。

    関連する章

    • 0:01 - Introduction
    • 1:02 - Guiding principles
    • 8:41 - Complex controls

    リソース

    • Accessible controls
    • Accessible descriptions
    • Accessibility fundamentals
    • Creating accessible views
      • HDビデオ
      • SDビデオ

    関連ビデオ

    WWDC24

    • SwiftUIにおけるアクセシビリティの最新情報
  • このビデオを検索

    こんにちは Khinです アクセシビリティ チームのソフトウェアエンジニアです。

    カスタムUIコントロールは ユーザーが アプリで独自の操作を行えるようにします。 ジェスチャを使用して 標準コントロールを超えた インタラクションが可能になります。 Appleでは テクノロジーはすべての人に 機能するときに最大の力を発揮すると考えています。 それは 支援技術を使用している 人々にも優れた体験を提供することを意味します。 VoiceOver、スイッチコントロールなどです。 コントロールをアクセシブルにすることで すべての人がアプリの機能に アクセスできるようになります。 このセッションでは アプリ内の あらゆるコントロールをアクセシブルにする方法を探ります。 まず 使用できるいくつかの 指針となる原則について説明します。 次に それらがいくつかの 複雑なコントロールにどう適用されるかを示します。

    では 指針となる原則について 話しましょう。 このスライダを考えてみてください。 SwiftUIの標準スライダです。 初めて見たとしても 外観からすでに多くのことが わかるかもしれません。 トラックと その上に ハンドルがあります。 ハンドルはトラックの ほぼ中央にあります。 ハンドルはつかんで動かせる ように見えます。 ドラッグして移動できます。 この視覚情報から このコントロールに 関する多くの暗黙の手がかりを得られます。 このコントロールが連続した 値を表すことがわかります。 現在の値も把握できます。 この場合 最大値の約半分です。 値を変更するなどの操作に 使用するジェスチャも識別できます。 ハンドルはドラッグ可能に見え ドラッグすると フィードバックは即座で トラックが塗りつぶされ ハンドルが動きます。 何かが起きたという 明確なフィードバックです。 誰も説明する必要がありません。 一目でわかります。 脳は形状、位置、 予想される動作を処理します。 すべてが一瞬のうちに。 それが視覚情報の 持つ力です。 では 画面が見えない場合は どうでしょうか。 トラック、ハンドル、位置 そのいずれも認識できません。 すべての人が視覚情報に アクセスできるわけではありません。 そのため 考慮することが重要です。 支援技術を使用している人々が これらのコントロールとどう操作するかを。

    VoiceOverがこのスライダを どう説明するかを見てみましょう。 VoiceOverはAppleプラットフォームの 組み込みスクリーンリーダーです。 視覚に障害のある方や ロービジョンの方が ジェスチャでデバイスを 操作できるようにします。 「明るさ 50% 調整可能。」 「1本の指で上下にスワイプして 値を調整してください。」 VoiceOverを使用することで スライダが何を制御するかを理解できます。 ラベルは「明るさ」と読み上げます。 このコントロールには値があり 現在50%に設定されていることも示します。 どのような操作が できるかも明確です。 「調整可能」と読み上げ 値の調整方法のヒントを提供します。 値が変化すると 新しい値をリアルタイムで読み上げます。 それがユーザーへの フィードバックです。 VoiceOverを使用している方は 優れた体験を得られます。 コントロールの視覚情報に アクセスできなくても。

    コントロールの視覚的な形式から 人々が得る情報を考えてください。 それぞれを指針となる原則として 活用しましょう。 アクセシビリティ体験のための原則としてです。 コントロールの目的が 理解されるようにします。 値を表す場合は その値を 支援技術で利用できるようにします。 どのような操作ができるか また コントロールを使用したときに どのようなフィードバックが 得られるかを明確にします。

    別の例を見てみましょう。 コーヒーメーカーアプリの カスタムコントロールです。 朝によってはフルカップが 必要なこともあります。 半分だけの朝もあります。 目覚ましで起きたか 猫の鳴き声で起きたかによります。 そこで 1つの簡単なジェスチャで コーヒーの量を制御できる アプリを作りました。 上にドラッグでコーヒーを増やし 下にドラッグで減らします。 塗りつぶしレベルは 抽出するオンス数を表します。 現在 このコントロールは アクセシビリティのための 追加情報を提供していません。 右にスワイプしてコントロールを 選択すると VoiceOverは何をするかも 値の変更方法も読み上げません。 「設定。」 「ボタン。」

    「6オンス。」 「カップを上下にドラッグ。」 このコントロールの操作方法が まだ明確ではありません。 でも大丈夫です。 いくつかの簡単なステップで 改善できます。 そのために 先ほど探った 指針となる原則に立ち返ります。 CoffeeDispenserViewの 実装を見てみましょう。 現在は コーヒーレベルをStateとして 宣言しスライダに渡しているだけです。 まず スライダを アクセシビリティ要素としてマークします。 明確な目的を与えるために accessibilityLabelモディファイアを使用して 「Coffee Dispenser」と命名します。 次に accessibilityValueモディファイアを 使用して 現在の塗りつぶしレベルを 読み上げます。 また VoiceOverがコーヒースライダを 組み込みスライダと 同じように調整できるようにします。 このコントロールに同じ インタラクションを追加します。 まず .adjustableトレイトを 追加します。 これにより VoiceOverはこのコントロールが スワイプで調整できることを認識します。 次に 各スワイプの動作を定義します。 .accessibilityAdjustableActionモディファイアを 使用して。 クロージャはdirectionパラメータを 提供します。 .incrementまたは.decrementです。 クロージャは各ケースを 処理する必要があります。

    これらの変更により 新しいVoiceOver体験を見てみましょう。 右にスワイプしてコントロールを選択し 上下にスワイプして コーヒーの量を調整します。 「Coffee dispenser 6オンス 調整可能。」 「1本の指で上下にスワイプして 値を調整してください。」

    「7オンス。」 「8オンス。」 「7オンス。」 「6オンス。」 VoiceOverを使用して1オンス単位で コーヒーレベルを調整できるようになりました。

    でも 0.5オンス単位で調整したい 場合はどうでしょうか。 正確な制御のために VoiceOverにはパススルージェスチャと 呼ばれる組み込み機能があります。

    パススルージェスチャを実行するには VoiceOverを使用している方が ダブルタップして長押しで アクティブにします。 ジェスチャはコントロールの accessibilityActivationPointから開始します。 指が動くと VoiceOverはタッチイベントを 直接コントロールに送信します。 これにより 値をより正確に 細かく制御できます。 コーヒースライダの場合 アクセシビリティアクティベーションポイントは デフォルトで中央にあります。 現在の塗りつぶしレベルに 合わせて設定します。 これにより ジェスチャは 常にコーヒーレベルの位置から開始し どちらの方向にも 調整する余裕が生まれます。

    パススルージェスチャ中に フィードバックを提供することも重要です。 そのために 値が変化したときに アクセシビリティアナウンスを 送信します。 ただし 毎回ではありません。 それだと煩わしくなります。 代わりに 最後に読み上げた内容と その時刻を追跡します。 値が実際に変化し 少なくとも0.3秒が経過していれば 読み上げます。 それ以外はスキップします。 これにより VoiceOverを使用している方は 意味のある更新を聞けます。

    ではダブルタップして長押しし 指を上に動かして パススルージェスチャを試し コーヒーレベルを9.5オンスまで 増やします。 「Coffee dispenser 6オンス 調整可能。」 「1本の指で上下にスワイプして 値を調整してください。」

    「6... 6.4オンス。」 「6... 6... 7... 7... 8.3オン... 8.4オンス。」 「8.5オン... 8.6オンス。」 「8.7オンス。」 「8.8オン... 9... 9.5オンス。」

    素晴らしいです。 コントロールがドラッグ可能になり 意味のある更新を提供します。 この体験は先ほど共有した 指針となる原則を 実現しています。 ラベル、値、アクション、 アナウンスを備えています。

    基本的なカスタムコントロールを 探ったので より複雑な例をいくつか 見てみましょう。 iOSで私のお気に入りの 機能の1つをご紹介します。 「バックグラウンドサウンド」です。 雨や波の音などの アンビエントオーディオを再生して 集中してリラックスするのに役立ちます。 アクセシビリティ設定から すぐに見つけられます。 設定の中には イコライザコントロールがあります。 2次元パッドです。 中央のハンドルを 表面上の任意の場所に動かせます。 このパッドには2つの次元があり 動かすことで音のトーンを調整できます。 視覚的には各軸に 周波数と振幅のシンボルがあります。 ハンドルをつかむと 実際に探索できます。 2つの値の空間を 同時に。 スライダでは adjustableトレイトが 2つのアクションを提供します。 incrementとdecrement 単一軸上で。 しかしこのコントロールには 2つの軸があります。 水平と垂直です。 adjustableトレイトを追加すると 1方向しかカバーできないため 理想的な解決策ではありません。 ここでカスタムアクションが 役に立ちます。 カスタムアクションを使用すると コントロールの一般的な操作を公開できます。 各アクションにはVoiceOverが 読み上げるラベルがあります。 そしてアクティブ化時に 実行されるクロージャがあります。 adjustableアクションとは異なり カスタムアクションは 定義した任意の操作をサポートします。 単一軸に限定されません。 このイコライザパッドでは カスタムアクションをこのように追加します。 イコライザパッドビューで accessibilityActionモディファイアを 4回追加します。 各アクションに説明的な 名前があります。 「上に移動」「右に移動」 「下に移動」「左に移動」。 それぞれが固定ステップで 単一軸を移動します。 この範囲内に制限されます。 これらのアクションにより 空間を探索することが可能になります。 支援技術を使用している方が すでに慣れ親しんだアクションを 実行するだけで。

    カスタムアクションを使用した イコライザパッドの体験です。 上下にスワイプしてアクションを選択し ダブルタップで実行します。 「フィルタチャート 周波数0 振幅10。」 「ダブルタップして長押しし ドラッグしてフィルタを調整。」 「チャート軸の範囲は -100から100に設定されています。」 「上下にスワイプして カスタムアクションを選択。」 「ダブルタップでアクティブ化。」 「下に移動。」 「上に移動。」 「右に移動。」 「左に移動。」 「右に移動。」 「上に移動。」 「周波数0 振幅20。」 「周波数0 振幅30。」 「周波数0 振幅40。」

    アクションを通じて 2D空間をナビゲートでき 音そのものが 明確なフィードバックを提供します。

    イコライザパッドは プラットフォームが自身の体験に 指針となる原則をどう適用するかの 良い例です。 次に 私が取り組んできた アプリをご紹介します。 独自のカスタムコントロールを 備えています。 私と同じようにペットが 大好きな方なら 仕事中に寂しくなることが あるでしょう。 日中も一緒にいられるように 猫と遊べる アプリを作りました。 画面から直接。 なでるとゴロゴロ鳴きます。 タップするとニャーと鳴きます。 ピンチすると 猫なので シャーッと返ってきます。 まさに本物そっくりです。 このコントロールのアクセシビリティ サポートはまだ追加していません。 VoiceOverでデフォルトの 体験を確認します。 「Cat fill スペース 画像。」 「猫に触れて操作。」 画面上の画像とだけ 読み上げます。 なでる、タップする、ピンチするは このコントロールがサポートする しかし VoiceOverはそれらの 存在を知りません。

    ゴロゴロ鳴く、こねこね踏む、 怒ったニャーという鳴き声も すべてそこにあります。 支援技術を使用している 人々と共有されるのを待ちながら。 VirtualCatはインタラクティブな 猫の表面を含むSwiftUIビューです。 コントロールの目的を 表現するために 「Virtual Cat」と読み上げる アクセシビリティラベルを追加します。 次に アクセシビリティバリューを 猫の現在の反応に設定します。 次に 猫との操作に使うジェスチャを VoiceOverに伝える方法が必要です。 パススルージェスチャも使えますが ここでは最適ではないかもしれません。 例えば 同じ操作を 何度も繰り返したい場合や 複数のジェスチャを使いたい場合があります。 そこでこのコントロールには ダイレクトタッチを使用します。 ダイレクトタッチAPIは画面の領域を ダイレクトタッチエリアとしてマークします。 allowsDirectInteractionトレイトを 追加すると タッチイベントがコントロールに 直接渡されます。 VoiceOverによって処理されるのではなく。 これにより コントロールを 直接操作できます。 サポートされているすべての ジェスチャを使用できます。 ダイレクトタッチオプションで この動作をカスタマイズできます。 最初のオプションは .requiresActivationです。 設定すると コントロールは ダイレクトタッチに反応しません。 ダブルタップするまで。 これにより 画面上で 指をドラッグしても 誤ってアクティブ化することがありません。 パススルージェスチャとは異なり ダイレクトタッチはアクティブな状態を保ちます。 フォーカスが別の要素に移るまで。 もう1つのオプションは .silentOnTouchです。 設定すると VoiceOverは 完全に無音になります。 誰かがエリアを触れているとき。 独自のオーディオフィードバックを 提供するコントロール向けです。 VoiceOverの音声が コントロール自体の音声に かぶってしまう場合に使います。 このコントロールをインタラクティブにするために .accessibilityDirectTouchモディファイアを .requiresActivationオプションで 追加します。

    ダイレクトタッチジェスチャが 実行できない方もいることに注意してください。 可能な限り コントロールを 操作する他の方法も公開するようにしましょう。 例えば カスタムアクションを 使用するなどです。

    VoiceOverでの更新された 体験を見てみましょう。 ダブルタップしてダイレクトタッチを アクティブにし 猫をなでる、タップする、 ピンチするを試します。

    「Virtual cat 眠っています。」 「アクティブ化してダイレクトタッチ 操作を開始。」 「アクション利用可能。」

    「Virtual cat。」 「眠っています。」

    これらの変更により VoiceOverを使用している方は コントロールの説明と ダイレクトタッチのジェスチャを知ることができます。 操作からフィードバックも 得られます。 これにより このアプリの 魅力のすべてを 支援技術を使用している 人々にも届けられます。

    独自のカスタムインタラクティブ コントロールを すべての人にアクセシブルにしましょう。 VoiceOverをオンにしてアプリを開き 改善の機会を見つけましょう。 カスタムコントロールを構築する際は 人々がコントロールの 目的、値、アクション、 フィードバックを理解できるか考えてください。 コントロールがジェスチャに依存する場合は ダイレクトタッチを検討してください。 パススルーが最適でない ジェスチャの場合 可能な限りカスタムアクションを 提供しましょう。 これにより スイッチコントロール、 Voice Controlを使用している方も その他の支援技術を使用している 人々も同じ操作にアクセスできます。 ご視聴ありがとうございました。

    • 5:01 - Improve accessibility for coffee dispenser

      // Improve accessibility for coffee dispenser
      
      import SwiftUI
      
      struct CoffeeDispenserView: View {
          @State var coffee: Double = 0.0
          var body: some View {
              CoffeeSlider(value: coffee)
                  .accessibilityElement()
                  .accessibilityLabel("Coffee Dispenser")
                  .accessibilityValue("\(Int(coffee)) ounces")
                  .accessibilityAddTraits(.adjustable)
                  .accessibilityAdjustableAction { direction in
                      switch direction {
                      case .increment:
                          increaseCoffeeAmount()
                      case .decrement:
                          decreaseCoffeeAmount()
                      }
                  }
          }
      }
    • 7:05 - Set the accessibility activation point

      // Set the accessibility activation point
      import SwiftUI
      
      struct CoffeeDispenserView: View {
          @State var coffee: Double = 0.0
      
          var body: some View {
              CoffeeSlider(value: coffee)
                  .accessibilityActivationPoint(
                      UnitPoint(x: 0.5, y: 1 - coffee)
                  )
          }
      }
    • 7:27 - Post accessibility announcements

      // Post accessibility announcements 
      
      import SwiftUI
      
      struct CoffeeDispenserView: View {
          @State var coffee: Double = 0.0
        
          var body: some View {
              CoffeeSlider(value: coffee)
                  // ...
                  .onChange(of: coffee) { _, newValue in
                      if sufficientTimeSinceLastAnnouncement() && valueHasChanged() {
                          cacheLastSpokenValue(newValue)
                          AccessibilityNotification
                              .Announcement(newValue)
                              .post()
                      }
                  }
          }
      }
    • 10:13 - Add custom actions

      // Add custom actions
      
      import SwiftUI
                                                                
      struct EqualizerView: View {
          var body: some View {
              EqualizerPad()
                  .accessibilityActions("Move Up") {
                      increaseY(by: 10)
                  }
                  .accessibilityActions("Move Right") {
                      increaseX(by: 10)
                  }
                  .accessibilityActions("Move Down") {
                      decreaseY(by: 10)
                  }
                  .accessibilityActions("Move Left") {
                      decreaseX(by: 10)
                  }
           }
       }
    • 12:47 - Customize accessibility for the interactive cat surface

      // Customize accessibility for the interactive cat surface
      
      import SwiftUI
      
      struct VirtualCat: View {
          var cat: CatModel
          var body: some View {
              InteractiveCatSurface()
                  .accessibilityLabel("Virtual Cat")
                  .accessibilityValue(cat.currentReaction.description)
                  .accessibilityDirectTouch([.requiresActivation])
           }
      }
    • 0:01 - Introduction
    • Why custom controls need accessibility support so everyone can use what your app was built to do, and what the session covers — guiding principles and how to apply them to complex controls.

    • 1:02 - Guiding principles
    • Create accessible custom controls by translating implicit visual cues into explicit information for assistive technologies. Apply labels, values, traits, and actions to ensure these controls are universally understood and actionable by everyone.

    • 8:41 - Complex controls
    • Complex controls, like multi-dimensional pads and highly interactive virtual surfaces, demand advanced accessibility techniques beyond basic labels and values. Implementing features like passthrough gestures, custom actions, and the Direct Touch API allows people to seamlessly navigate and interact with these interfaces.

Developer Footer

  • ビデオ
  • WWDC26
  • カスタムコントロールのアクセシビリティの向上
  • メニューを開く メニューを閉じる
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    Open Menu Close Menu
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • SF Symbols
    メニューを開く メニューを閉じる
    • アクセシビリティ
    • アクセサリ
    • Apple Intelligence
    • App Extension
    • App Store
    • オーディオとビデオ(英語)
    • 拡張現実
    • デザイン
    • 配信
    • 教育
    • フォント(英語)
    • ゲーム
    • ヘルスケアとフィットネス
    • アプリ内課金
    • ローカリゼーション
    • マップと位置情報
    • 機械学習とAI
    • オープンソース(英語)
    • セキュリティ
    • SafariとWeb(英語)
    メニューを開く メニューを閉じる
    • 英語ドキュメント(完全版)
    • 日本語ドキュメント(一部トピック)
    • チュートリアル
    • ダウンロード
    • フォーラム(英語)
    • ビデオ
    Open Menu Close Menu
    • サポートドキュメント
    • お問い合わせ
    • バグ報告
    • システム状況(英語)
    メニューを開く メニューを閉じる
    • Apple Developer
    • App Store Connect
    • Certificates, IDs, & Profiles(英語)
    • フィードバックアシスタント
    メニューを開く メニューを閉じる
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program(英語)
    • Mini Apps Partner Program
    • News Partner Program(英語)
    • Video Partner Program(英語)
    • セキュリティ報奨金プログラム(英語)
    • Security Research Device Program(英語)
    Open Menu Close Menu
    • Appleに相談
    • Apple Developer Center
    • App Store Awards(英語)
    • Apple Design Awards
    • Apple Developer Academy(英語)
    • WWDC
    最新ニュースを読む。
    Apple Developerアプリを入手する。
    Copyright © 2026 Apple Inc. All rights reserved.
    利用規約 プライバシーポリシー 契約とガイドライン