VoiceOverはAppleの内蔵スクリーンリーダーで、インターフェースのすべての要素を音声で読み上げ、ジェスチャーでデバイスを操作できます。このテクノロジーはiOS、iPadOS、macOSにシステムレベルで組み込まれており、追加ソフトウェアのインストールは不要です。Apple Accessibility(2025)によると、VoiceOverは40以上の言語に対応し、世界中の何百万人もの視覚障害者に使用されています。
重要なポイント
VoiceOverはAppleのオペレーティングシステムに組み込まれたスクリーンリーダーです。視覚障害者向けに設計されており、視覚的な接触なしにデバイスと完全にやり取りできます。VoiceOverはボタン、リンク、テキスト、画像、通知、システム要素など、インターフェースのすべての要素を音声で読み上げます。
このテクノロジーは2005年にmacOS向けに初めて導入され、iOSには2009年にiPhone 3GSとともに登場しました。それ以来、VoiceOverはAppleエコシステムの不可欠な部分となり、プラットフォームのアクセシビリティを支持する主要な論拠の一つとなっています。VoiceOverはシステムレベルで組み込まれているため、開発者による追加の統合なしに任意のアプリケーションで動作しますが、読み上げの品質はアプリケーションがiOSアクセシビリティAPIをどれだけ適切に使用しているかに直接依存します。
VoiceOverは自然な音声合成で40以上の言語に対応し、地域の音声設定に適応します。iOSでは、VoiceOverは日本語や他の多くの言語でSiriの音声エンジンを使用し、句読点や文脈に応じて最も自然な発音と正確なイントネーションを実現します。
VoiceOverはタッチイベントをインターセプトし、標準のiOS入力とは異なる方法で解釈します。ユーザーが画面に触れると、VoiceOverは指の下の要素をアクティブにせず、まずそれを読み上げます。ダブルタップ後にのみ要素がアクティブになります。この重要な違いにより、視覚障害者は誤ったクリックのリスクなしにインターフェースを探索できます。
VoiceOverはインターフェース要素を論理的な順序で読み上げます:左から右、上から下へ。読み上げ順序はiOSのビュー階層から継承されますが、開発者は複雑なレイアウトのためにaccessibilityElementsプロパティで変更できます。ユーザーは右スワイプ(次へ)と左スワイプ(前へ)で要素間を移動したり、特定の要素にタッチして読み上げさせることができます。
移動のたびに、VoiceOverは要素のタイプ(ボタン、リンク、見出し)、名前(accessibilityLabel)、状態(選択済み、無効)、ヒント(accessibilityHint)を読み上げます。要素に値がある場合(音量スライダーなど)、VoiceOverはそれも読み上げます。Accessibility Traits(UIAccessibilityTraits)は、要素がボタン、スイッチ、検索フィールド、キーボードキーのいずれであるかなど、その動作をユーザーに追加で伝えます。
ロータはVoiceOverのナビゲーションモードを切り替える仮想調整ダイヤルです。ユーザーは2本の指でロータを回転させ(音量つまみのように)、単語、文字、見出し、リンク、エントリポイント、テーブル行などのモードを選択します。見出しモードではWebページやアプリケーション内でH1-H6をすばやく切り替えられ、文字モードではテキストを一文字ずつ読み上げるため、フォーム入力や確認コードの入力時に便利です。
開発者はUIAccessibilityCustomRotor APIを通じてロータにカスタムモードを追加できます。例えば、メモアプリで「お気に入りのメモ」や「最近の変更」ロータを追加できます。カスタムロータは特定のアプリケーションでのナビゲーションを大幅に高速化し、iOSアクセシビリティのベストプラクティスと見なされています。
VoiceOverは標準のiOSジェスチャーとは異なる独自のジェスチャーセットを使用します。ほとんどのジェスチャーは1本指ではなく3本指で実行されます。これにより通常の操作との競合を防ぎ、VoiceOverが標準入力と同時に動作できます。
| 操作 | ジェスチャー | 結果 |
|---|---|---|
| 要素を読み上げ | 1本指でタップ | 要素名を読み上げ |
| アクティブ化 | ダブルタップ | ボタンまたはリンクを押す |
| 次の要素 | 右にスワイプ | 次へ移動 |
| 前の要素 | 左にスワイプ | 前に戻る |
| スクロール | 3本指でスワイプ | リストまたはページをスクロール |
| ロータ | 2本指で回転 | ナビゲーションモードを変更 |
ダブルタップジェスチャーはVoiceOverで要素をアクティブにする主要な方法です。要素が特別な操作(ドラッグなど)を必要とする場合、VoiceOverは「タップ→ダブルタップ&ホールド」の順序で移動モードに入ります。これにより、画面を見ずにドラッグ&ドロップなどの複雑なジェスチャーを実行できます。VoiceOverは操作をキャンセルするための「2本指ダブルタップ」やスクリーンカーテンのオン/オフを切り替える「トリプルタップ」ジェスチャーもサポートしています。
iOSアプリケーション開発者はUIAccessibility APIを通じてVoiceOverとの対話を大幅に改善できます。基本的なアクセシビリティ設定はInterface Builder(Identity Inspector → Accessibility)で追加できますが、複雑なインターフェースにはコードでのプログラム的な設定が必要です。
accessibilityLabelプロパティは、VoiceOverが要素に対して読み上げるテキストを設定します。ラベルが設定されていない場合、VoiceOverはボタンのテキストやテキストフィールドのプレースホルダーを使用します。テキストのない要素(アイコン、カスタムビュー)にはラベルが必須です。accessibilityTraitsプロパティは要素のタイプ(ボタン、見出し、スイッチ、検索フィールド、キーボードキー、値変更、リンクなど)を定義します。
let profileButton = UIButton(type: .custom)
profileButton.setImage(UIImage(named: "avatar"), for: .normal)
profileButton.isAccessibilityElement = true
profileButton.accessibilityLabel = "ユーザープロフィール"
profileButton.accessibilityTraits = .button
profileButton.accessibilityHint = "プロフィール設定画面を開く"
isAccessibilityElementフラグはカスタムビューのVoiceOverサポートを有効にします。デフォルトでは標準要素(UIButton、UILabel、UITextField)に対してのみtrueです。accessibilityHintパラメータはヒントを追加します。ユーザーが要素に留まると、VoiceOverは一時停止の後にヒントを読み上げます。ヒントは「設定画面を開く」のように操作の結果を説明すべきであり、「開くには押してください」のような指示ではありません。
要素の論理グループが視覚的な順序と一致しない複雑な画面では、accessibilityElements(読み上げ順序を設定する配列)を使用します。例えば、商品カードには画像、名前、価格、「カートに追加」ボタンが含まれます。これらの要素がビュー階層で混沌と配置されている場合、accessibilityElementsがVoiceOverの正しい順序を確立します。
let productCard = UIView()
let productImage = UIImageView()
let productName = UILabel()
let productPrice = UILabel()
let addToCartButton = UIButton()
productCard.accessibilityElements = [
productImage, productName, productPrice, addToCartButton
]
複数の要素を1つのアクセシブルな要素に結合するには、UIAccessibilityContainerまたはタッチ領域をオーバーライドするaccessibilityFrameを使用します。これは、テーブルセルに複数のUIコンポーネントが含まれているが論理的には1つの要素を表す場合に便利です。VoiceOverはセル全体をまとめて読み上げ、個別に内容を繰り返すべきではありません。
VoiceOverの正しいアクセシビリティ設定には、セマンティックマークアップ、動的更新、カスタム要素の処理、実際のスクリーンリーダーでのテストなど、いくつかの側面への注意が必要です。
SwiftUIでは、アクセシビリティは.accessibilityLabel()、.accessibilityValue()、.accessibilityHint()、.accessibilityAddTraits()修飾子を通じて設定します。SwiftUIは標準要素から自動的にアクセシビリティを継承しますが、カスタムコンポーネントには明示的な設定が必要です。例えば、カスタムスライダーはVoiceOverにその値と変更形式を伝える必要があります。
Slider(value: $volume, in: 0...100)
.accessibilityLabel("音量")
.accessibilityValue(
Text("\(Int(volume)) パーセント")
)
.accessibilityAddTraits(.adjustsAudioForAccessibility)
.accessibilityAdjustableAction { direction in
switch direction {
case .increment: volume = min(volume + 5, 100)
case .decrement: volume = max(volume - 5, 0)
}
}
accessibilityAdjustableAction修飾子は、VoiceOverのジェスチャーで値を変更する機能を追加します(上スワイプで増加、下スワイプで減少)。この修飾子がないと、スライダーはスクリーンリーダーによる制御ができなくなります。カスタムステッパー、ピッカー、その他の値を変更する要素にも同様の設定が必要です。
画面上のコンテンツが動的に変化する場合(通知の到着、読み込みステータスの更新、価格の変更)、VoiceOverはUIAccessibility.postを通じて通知を受け取る必要があります。この呼び出しがないと、スクリーンリーダーは変更を認識できず、ユーザーは重要な情報を見逃します。SwiftUIでは.accessibilityAnnouncement()修飾子を使用します。
UIAccessibility.post(
notification: .announcement,
argument: "価格が20パーセント値下げされました"
)
// SwiftUI
Text("価格が更新されました")
.accessibilityAnnouncement(Text("20%割引"))
VoiceOver通知は賢明に使用する必要があります。過剰なアナウンスはユーザーを煩わせ、その欠如はアプリケーションをアクセス不能にします。最適な戦略は、ユーザーの現在のワークフローに影響する変更(カートの更新、読み込み状況、フォーム検証エラー、チャット通知)のみを通知することです。バックグラウンドの変更(パネルの時刻、為替レート)は通知の必要はありません。ユーザーは必要に応じて自分で確認します。
VoiceOverのテストは、スクリーンリーダーを有効にした実機またはAccessibility Inspectorオプション付きのiOSシミュレーターで実行します。視覚的な制御なしで登録完了、注文、商品検索などの完全な使用シナリオをテストすることが重要です。視覚的なフィードバックなしで操作できるのであれば、VoiceOverは正しく設定されています。
よくある質問
設定 → アクセシビリティ → VoiceOver。スイッチをオンにします。すばやく有効にするには、サイドボタン(iPhone X以降)またはホームボタンをトリプルクリックします。Siriに「VoiceOverをオンにして」と話しかけて有効にすることもできます。
VoiceOverはAppleのiOS用スクリーンリーダー、TalkBackはGoogleのAndroid用スクリーンリーダーです。動作原理は同じです。タッチで読み上げ、ダブルタップでアクティブ化します。違いはジェスチャー、ロータ設定、エコシステム統合にあります。VoiceOverはiCloudやApple Payとの統合がより深いです。
UIAccessibility APIを使用します。すべての要素にaccessibilityLabel、要素タイプにaccessibilityTraits、ヒントにaccessibilityHintを設定します。SwiftUIでは.accessibilityLabel()修飾子と.accessibilityAddTraits()修飾子を使用します。VoiceOverを有効にしてアプリケーションをテストします。
ロータは2本指の回転で切り替えるナビゲーションモードです。見出し、文字、単語、リンク、エントリポイントのどれで要素間を移動するかを決定します。開発者はUIAccessibilityCustomRotorを通じて独自のモードを追加できます。
カスタムUIViewの場合、isAccessibilityElement = trueを設定し、accessibilityLabelを指定する必要があります。要素が複数の子ビューで構成されている場合は、accessibilityElementsを使用して読み上げ順序を設定するか、コンテナに結合します。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。