VoiceOverとは
視覚障害者の方向けの音声読み上げ機能。
[設定]アプリの[一般]-[アクセシビリティ]から設定できる。
プログラミングガイド
プログラム
プログラム上で、読み上げる音声やカーソルを当てるかどうかなどを制御する方法を記載する。
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);
以上。