iOSには設定にアクセシビリティとあるようにVoiceOverによる読み上げや画面の拡大縮小やAssistiveTouchなどの機能が備わっています。

iOSアプリ開発においてアクセシビリティと関係する所は、VoiceOverによる読み上げ機能に読ませるアクセシビリティラベルやヒントといった情報についてです。(VoiceOver機能はiOS5からiPhone単体で初期設定時もVoiceOverが利用可能になっています)

iOSアプリのVoiceOver対応については以下のスライドがよくまとまっています。

ボタンやViewと言った範囲に対してアクセシビリティ属性を指定することができて、
アクセシビリティ属性はおおまかに以下の要素が存在しています。

  • Label(ラベル)
    コントロールやビューの簡潔な説明(デフォルトはtitleと同じ)
  • Traits(特性)
    それぞれが要素の状態、動作、または使用方法の特徴の説明
  • Hint(ヒント)
    要素に対するアクションの結果を説明
  • Frame(フレーム)
    要素の画面位置とサイズをCGRect構造体での座標
  • Value(値)
    値がラベルで表されていない場合の、要素の現在の値て。 スライダーとかで利用する

先ほどのスライドでも、書かれていましたがアクセシビリティ属性を設定していない画像ボタン(titleもない)ものは、画像のファイル名がラベルに採用されてVoiceOverで読み上げられます。
基本的にはラベルが読み上げられて、他のアクセシビリティ属性が存在していた場合はそれらも読み上げられます。
iOSアプリではアイコンだけというボタンも結構多いため、アクセシビリティに対応するにはアクセシビリティ属性を設定してあげることが重要となります。

アクセシビリティの設定

要 素のアクセシビリティはデフォルトでEnableとなっていますが、[sampleButton setIsAccessibilityElement:YES];という感じで要素ごとにアクセシビリティを有効、無効化できます。(デフォルトではアク セシビリティ属性値は何も入っていないのでtitleなどが読まれる)

アクセシビリティについての確認をするときはシミュレーターにはアクセシビリティインスペクタという機能があるため、
設定>一般>アクセシビリティ> Accessibility Inspector をONにするといいです。

NewImage

アクセシビリティインスペクタでは上のように、アクセシビリティ属性が設定されているものの情報を表示できます。
(フレームの表示とかはアクセシビリティ関係なく便利な気がします)

Xcodeのインターフェースビルダー上からもアクセシビリティ属性の設定を行う事ができます。
ラベルに何も書いていない場合はtitleプロパティ(下ではボタンRole)がラベルになります。

NewImage

コードからもアクセシビリティ属性は設定できます(コチラのほうが詳細にできる)
コードからは

sampleButton.accessibilityLabel, sampleButton.accessibilityHint

などに文字列を設定すればアクセシビリティ属性値の設定ができます。

サンプル

アクセシビリティ要素が有効な条件

先ほど、アクセシビリティはデフォルトでEnableと書きましたが、VoiceOver(またはアクセシビリティインスペクタ)が無効時にアプリを起動すると、なぜか全てのアクセシビリティが無効化された状態になり、xibで設定されたラベルやヒントがnullとなってしまいます。
そのため、VoiceOver無効時は明示的にそれぞれの要素に対してsetIsAccessibilityElement:YESをしてから属性値を指定しないと、アクセシビリティ属性は利用できないようになっています。
VoiceOverが有効の有無は UIAccessibilityIsVoiceOverRunning() の返り値で判定することができるため、VoiceOverが有効なときのみアクセシビリティ属性を設定するといった形にできます。(アクセシビリティイン スペクタの有無はちょっとわからない…)

普通はVoiceOverが無効ならアクセシビリティ属性を設定する意味は無いので、上記の事は知っててもあまり意味はないような気がしますが、
NewImage

上の図のような、VoiceOverが無効な環境ではツールチップでヒントとして表示させるということをやりたくて、何も考えずにアクセシビリティ属性を利用したら、アクセシビリティ属性値がnullで取得できなくなりハマっていました。
最終的には UIAccessibilityIsVoiceOverRunning() で場合分けして、アクセシビリティが有効の場合はアクセシビリティ属性にヒントを入れて、無効な場合は下記のようなオレオレ属性をUIControlに追 加できるようにするカテゴリを使って、ヒント情報をオレオレ属性値として持たせるようにしてみました。

これでアクセシビリティ属性を設定と、通常のユーザーに対してのヒント情報の設定を同時に出来るようになり、結構面白い感じに出来た気がします。
VoiceOverを普段利用するわけではないので、アクセシビリティ属性を設定するモチベーションはあまり高くはないと思いますが、通常のユーザーから も見えるように平行して行えるような仕組みを持てば、そのような情報を設定するのも意外と楽しくなったりするし、アクセシビリティにも優しいアプリが作れ るようになる気がします。

おまけ

「90%のユーザビリティよりも100%のアクセシビリティを」という言葉が結構気に入ってて、実際に100%のアクセシビリティは無理なのですが、アクセシビリティというものを意識する事で何か違った見方ができるんじゃないかと思っています。
アクセシビリティに対応しなくてもいいからアクセシビリティについて知っておくと、WebのWAI-ARIAもそうですが、少しものの見方が変わる気がします。

Post Navigation