I'm trying to make a UIPickerView of mine Voice Over accessible, I've noticed that the UIPickerViewAccessibilityDelegate protocol is rather incomplete. It only allows you to specify labels and hints for pickerView components, not the rows within the components. (it also has a bug that its pickerView:accessibilityLabelForComponent: method doesn't pass a UIPickerView* in it's pickerView parameter, it's a UIAccessibilityPickerComponent instead!)
So i'm wondering now, is there any way at all to set custom accessibility labels for the rows of my picker, or is it only possible to read out the actual picker row values as displayed on the screen?
I'm trying to do a picker view that shows time on it, hours, minutes, seconds. I couldn't get the datePicker to do this. But it'd be nice if each row could in voice over say something like "3 hours" instead of just 3. If I have to set the visible labels to what I want the voice over to read out then I'm not sure the labels are going to fit to show this, ie.
15 hours 35 minutes 20 seconds
is quite a lot to fit on the screen in english, not sure how big it'll grow when localised.. hence the ideal of being able to set labels for each row.
Cheers
If you are implementing the
pickerView:viewForRow:forComponent:reusingView:
method ofUIPickerViewDelegate
as the way to populate the UIPickerView components, you can achieve custom accessibility label for each row by settingaccessibilityLabel
on theUIView
you are returning from that method.Note that I wasn't successful at making VoiceOver read custom accessibility label in cases where I populate the
UIPickerView
usingpickerView:titleForRow:forComponent:
- even settingaccessibilityLabel
on the returnedNSString
(which does work in some other contexts, like setting accessibility labels for UITableView indexes) did not change what VoiceOver pronounces. So it seems the only way to go if you want to customize what VoiceOver (or Switch Control) speaks for a UIPickerView row is to usepickerView:viewForRow:forComponent:reusingView:
, not any of the other 2 candidate methods, to populate the UIPickerView rows.However, I still recommend you to reconsider whether what you are doing is desirable. When VoiceOver (or Switch Control) user arrives on the component, say e.g. with
accessibilityLabel
"Minutes", they know they are on minutes, because VoiceOver reads e.g. "Minutes, 19", and so when adjusting the value, they don't need to hear again "20 minutes", "21 minutes"; "20" and "21" quite suffices, the user can remember the context (e.g. "now I am on minutes, so let's adjust it to 45").