2016-05-05 12 views
2

私のアプリでは、ややカスタマイズされたUIPickerViewがあります。基本的に私はpickerView:viewForRow:forComponent:reusingViewを使って簡単なUILabelを返します。このアプリケーションをより使いやすくするために作業を始めたとき、私はVoiceOverがラベルを読み取り、たとえば「3 of 300」(行の「of」の合計行)を追加することに気付きました。これは望ましい動作ではありません。iOS - カスタマイズされたUIPickerViewでの予期しないVoiceOver動作

の代わりにpickerView:titleForRow:forComponentを使用すると、他の変更を加えなければ、選択した行の「タイトル」を読むだけでVoiceOverの動作がわかります。私はこれをiOS 9でテストしました。pickerView:viewForRow:forComponent:reusingViewを使用しているのに、UIPickerViewを「通常の」VoiceOverビヘイビアに戻すにはどうすればよいですか?助けてくれてありがとう!

+0

ラベルにいくつかのUIAccessibilityElementプロパティを設定してみてください。いくつかの組み合わせが役に立ちます。 – rmaddy

+0

[この質問と回答](http://stackoverflow.com/questions/30790992/how-to-set-the-voice-over-accessibility-label-for-uipickerview-rows)も読んでください。 – rmaddy

+0

@rmaddy基本的には、そのラベルのすべてのアクセシビリティプロパティを設定しようとしましたが、役に立たないものです。それについて考えると、ラベルそのものは独自の行番号や特に行数を認識しません。おそらくピッカー自体のいくつかの特性でしょう。 –

答えて

3

私はAppleのサポートにこの点について尋ねました。正式な返答は「私たちのエンジニアはあなたの要求を見直し、現在出荷されているシステム構成で希望の機能を達成するためのサポートされた方法がないと結論づけました。 (後継の場合 - これは最新のiOSバージョンが9.4だったとき)。彼らは私がするかもしれない新しい機能の要求を提出するように提案しました。

この問題を解決するため、次の回避策を検討しました。

  • は私が持っていたクラスとほぼ同じ基本クラスを作成したが、唯一のpickerView:titleForRow:forComponentなくpickerView:viewForRow:forComponent:reusingViewを実装します。このクラスは、バニラ非カスタマイズピッカーを提示します。
  • pickerView:viewForRow:forComponent:reusingViewを実装する、その基本クラスのサブクラスを作成しました。このクラスは、完全にカスタマイズされたピッカーを提示します。私のコードで
  • は他のVoiceOverがオンのときに、基本クラスのオブジェクトを作成するためにUIAccessibilityIsVoiceOverRunning()を使用し、サブクラスのオブジェクトは、それ以外の場合は

このように、ユーザはVoiceOverのを実行している、彼らは視覚的に醜いピッカーを得るが、アクセシビリティの観点から完全に適切に動作するもの(行番号のアナウンスなし)。ユーザーは基本的に視覚的な外観に気をつけないことが保証されているので、これは完全に合理的な「妥協」です。そうtitleForRowviewForRowを使用してそれ以外の場合は使用している場合

0

一つの修正は、ボイスオーバーが

UIAccessibilityIsVoiceOverRunning() 

を実行しているかどうかをチェックすることになります。そうすれば、あなたは正常な経験を損なうことはありません。

+0

私自身の解決策を見れば、それは基本的に私がやったことです。私が理解しているように、iOSはイントロスペクションを使用してデリゲートが 'viewForRow'を実装しているかどうかをチェックし、' titleForRow'ではなくそのメソッドを使用します。このイントロスペクションのために私はサブクラス化しなければならなかった。しかし、おそらくiOSがサブクラス化せずに 'viewForRow'を使用するのを防ぐ方法を提案できますか? –