Объедините UISwitch и UITableViewCell для взаимодействия VoiceOver
В Календаре, когда вы создаете новое событие, если вы нажмете на ячейку "Весь день" с включенным VoiceOver, Siri говорит: "Кнопка включения / выключения на весь день, дважды нажмите, чтобы изменить настройку". И действительно, двойное нажатие переключит переключатель. Кроме того, невозможно нажать только на сам тумблер - вам нужно взаимодействовать с самой ячейкой, чтобы переключить сам переключатель, сам переключатель не является доступным элементом.
В моем приложении у меня точно такая же настройка с меткой и переключателем. Но когда я касаюсь ячейки с включенной функцией VoiceOver, она только читает метку, поэтому слепой пользователь даже не подозревает, что в этой ячейке есть тумблер. Если они касаются самого переключателя, то они могут взаимодействовать с ним, так что это противоположно настройке в приложении Календарь.
Как я могу получить то же поведение, которое реализовал Apple? Мне нужен какой-то способ объединить переключатель в ячейку, чтобы VoiceOver считывал оба при выделении ячейки, затем, когда они дважды щелкают по ней, должен переключаться переключатель, и я не уверен, как эта настройка может быть выполнена. Спасибо!
3 ответа
Для реализации желаемого поведения, вместо размещения UISwitch
в contentView
ячейки, добавьте его как accessoryView
программно. Тогда при использовании VoiceOver ячейка и переключатель будут работать точно так, как ожидается, точно так же, как в Календаре.
Я хотел бы остановиться на ответе Джои и уточнить, как можно решить этот вопрос в коде.
В tableView:cellForRowAtIndexPath: создайте пользовательское представление UISwitch и добавьте его в accessoryView ячейки. Это может выглядеть примерно так:
UISwitch *switchView = [[UISwitch alloc] initWithFrame:CGRectZero];
[switchView setOn:NO];
[switchView addTarget:self action:@selector(selector:) forControlEvents:UIControlEventValueChanged];
cell.accessoryView = switchView;
return cell;
Ячейка теперь будет вести себя как любой собственный переключатель iOS, известный, например, из настроек или календаря. Двойное нажатие на ячейку с включенным VoiceOver теперь переключает UISwitch (вкл / выкл), и VoiceOver автоматически уведомляет пользователя о состоянии переключателя вместе с подсказкой о доступности.
Вы должны быть в состоянии установить пользовательское описание доступности для ячейки, используя
cell.accessibilityLabel = @"Double tap to toggle setting";
Вы можете настроить собственные жесты для запуска VoiceOver в соответствии с этим ответом:
/questions/38315138/est-li-sposob-sozdat-sobstvennyij-zhest-voiceover/38315148#38315148
Но здесь вам не понадобятся пользовательские жесты, вместо didSelectRowAtIndexPath
щелкнет выключателем только тогда, когда UIAccessibilityIsVoiceOverRunning
правда.