Как установить метку доступности Voice Over для строк UIPickerView?

Я пытаюсь сделать UIPickerView моего Voice Over доступным, я заметил, что протокол UIPickerViewAccessibilityDelegate довольно неполный. Он позволяет указывать метки и подсказки только для компонентов pickerView, а не для строк внутри компонентов. (у него также есть ошибка, заключающаяся в том, что его метод pickerView:accessibilityLabelForComponent: не передает UIPickerView* в своем параметре pickerView, вместо этого это UIAccessibilityPickerComponent!)

Итак, теперь мне интересно, есть ли способ вообще установить пользовательские метки доступности для строк моего средства выбора или можно только прочитать фактические значения строк средства выбора, отображаемые на экране?

Я пытаюсь сделать представление выбора, которое показывает время, часы, минуты, секунды. Я не мог заставить datePicker сделать это. Но было бы неплохо, если бы в каждой строке закадровый голос мог говорить что-то вроде «3 часа», а не просто 3. Если мне нужно установить видимые метки на то, что я хочу, чтобы закадровый голос читал, то я не уверен, что этикетки будут соответствовать, чтобы показать это, т.е.

15 часов 35 минут 20 секунд

довольно много, чтобы поместиться на экране на английском языке, не уверен, насколько большим он будет расти при локализации ... отсюда идеальная возможность устанавливать метки для каждой строки.

Ваше здоровье


person jimbobuk    schedule 11.06.2015    source источник


Ответы (1)


Если вы реализуете метод pickerView:viewForRow:forComponent:reusingView: из UIPickerViewDelegate в качестве способа заполнения компонентов UIPickerView, вы можете получить собственную метку доступности для каждой строки, установив accessibilityLabel в UIView, который вы возвращаете из этого метода.

Обратите внимание, что мне не удалось заставить VoiceOver читать пользовательскую метку специальных возможностей в тех случаях, когда я заполняю UIPickerView с помощью pickerView:titleForRow:forComponent: — даже установка accessibilityLabel для возвращаемого NSString (которая работает в некоторых других контекстах, например установка меток специальных возможностей для индексов UITableView) не помогла. изменить то, что VoiceOver произносит. Таким образом, кажется, что единственный способ, если вы хотите настроить то, что VoiceOver (или Switch Control) говорит для строки UIPickerView, — это использовать pickerView:viewForRow:forComponent:reusingView:, а не любой из двух других методов-кандидатов, для заполнения строк UIPickerView.

Тем не менее, я все же рекомендую вам еще раз подумать, желательно ли то, что вы делаете. Когда пользователь VoiceOver (или Switch Control) подключается к компоненту, например, с accessibilityLabel «Минуты» они знают, что это минуты, потому что VoiceOver читает, например, «Минуты, 19», так что при корректировке значения им не нужно лишний раз слышать «20 минут», «21 минута»; «20» и «21» вполне достаточно, пользователь может запомнить контекст (например, «сейчас у меня минуты, так что давайте настроим его на 45»).

person Boris Dušek    schedule 11.06.2015
comment
Спасибо за информацию. Думаю, я застрял в данный момент, так как не могу указать метку доступности для компонента, как я описал метод pickerView:accessibilityLabelForComponent: не передает UIPickerView* в своем параметре pickerView, вместо этого используется UIAccessibilityPickerComponent, который является частным API и имеет свойство выбора, которое является правильным средством выбора. Проблема в том, что у меня есть несколько средств выбора в этом ViewController, поэтому мне нужно определить, для какого средства выбора я устанавливаю метку доступности компонента. Я зарегистрировал ошибку радара по этому поводу. - person jimbobuk; 12.06.2015
comment
Вы делаете хорошее замечание о дополнительном повторении, хотя спасибо. Если я смогу исправить метки компонентов, то, возможно, я смогу их удалить. На данный момент я просто установил полные видимые метки на то, что хотел. - person jimbobuk; 12.06.2015
comment
Я хочу повторить, что вы можете вернуть UIView (например, UILabel) из pickerView:viewForRow:forComponent:reusingView:, чье text будет, например. 20 и чье accessibilityLabel будет 20 минут. Не нужно, чтобы текст UILabel тоже был 20 минут (или возвращать 20 минут от pickerView:titleForRow:forComponent:). Извините, если я неправильно понял ваш комментарий, и это не так. - person Boris Dušek; 12.06.2015
comment
Еще раз спасибо. Я посмотрю, как перейти на этот метод. Сейчас я борюсь с другим элементом доступности на том же контроллере представления :( Ура - person jimbobuk; 12.06.2015
comment
Вы видите проблему, из-за которой индекс PickerView не подходит, когда мы пролистываем строки? Я всегда получаю 1 из #totalNumber независимо от того, к какой строке я прокручиваю. - person Nishchith; 29.06.2021