Posted at

iOSのアクセシビリティ(VoiceOver)対応まとめ

More than 3 years have passed since last update.


VoiceOverとは

視覚障害者の方向けの音声読み上げ機能。

[設定]アプリの[一般]-[アクセシビリティ]から設定できる。


プログラミングガイド

iOSアクセシビリティプログラミングガイド(日本語)


プログラム

プログラム上で、読み上げる音声やカーソルを当てるかどうかなどを制御する方法を記載する。


UIAccessibility

基本的にUIAccessibilityのプロパティに値をセットすることで制御する。

UIViewやUIControllのサブクラスはデフォルトで実装されている。

主に自前のカスタムビューに対して実装する必要があるかと思います。


isAccessibilityElement

VoiceOverの対象にする場合はisAccessibilityElementにYESをセット。

self.isAccessibilityElement = YES;

サブビューを含む場合、親ビューのisAccessibilityElementがYESの場合はサブビューにカーソルは当たらない。

親ビューのisAccessibilityElementをNOにした場合、(サブビューのisAccessibilityElementがYESであれば)カーソルがあたる。


accessibilityElementsHidden

UITableViewやUICollectionViewではView自体のisAccessibilityElementをNOにしても内部のセルなどにカーソルが当たってしまう。

サブビューも含めてView全体をアクセシビリティ対象から外したい場合はaccessibilityElementsHiddenをYESにする。

// UITableViewControllerのサブクラスとかで

self.tableView.accessibilityElementsHidden= YES;


accessibilityLabel

カーソルが当たった時に読み上げるテキストを指定。

self.accessibilityLabel = @"読み上げるテキスト";

UILabelやUITextFieldはデフォルトで設定されているテキストが読み上げられるようになっている。

UIButtonやUIImageViewなどで設定されているイメージのリソースIDが読み上げられたりするため、必要に応じてテキストを設定する。


accessibilityHint

ユーザーが操作するためのヒントを指定。

たとえば、スイッチとかテキストフィールドにカーソル当たった時とかに使う。

UILabelなどと組み合わせたViewのときに、ラベルの方はカーソル当てないようにしておいて、別途ヒントを読み上げるといった使い方ができる。

// ユーザー名

UILabel* userNameLabel = [UILabel alloc]init];
userNameLabel.text = @"ユーザー名";

// ラベルにはカーソルを当てない
userNameLabel.isAccessibilityElement = NO;

// ユーザー名のフィールド
UITextField* userNameField = [[UITextField alloc] init];

// フィールドにカーソルが当たった時、「ユーザー名」+「フィールドに入力された文字列」を読み上げる
userNameField.accessibilityHint = userNameLabel.text;


accessibilityTraits

ビューの特性を指定。

カーソルが当たった時、「~~ボタン」、「~~イメージ」のように特性も読み上げられるため、必要あれば指定する。

// 特性をボタンにする

self.accessibilityTraits = UIAccessibilityTraitButton;

カスタムビューのTraitsの決まり方はちゃんと調べていないが、「ボタンとして扱いたいが、デフォルトだとイメージになっている」といったことがある。


端末のVoiceOver設定がOnになっているか取得したい

UIAccessibilityIsVoiceOverRunning()がYESかどうかで判定できる。

if (UIAccessibilityIsVoiceOverRunning()) {

// VoiceOverオンのときの処理
}


指定したビューにカーソルを当てたい

UIAccessibilityPostNotificationを使う。

// hogeは何かのビュー

UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, hoge);

以上。