25
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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);

以上。

25
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?