Установка фокусировки на кнопочном элементе UIAlertView во время VoiceOver - UIAccessibility

Я намереваюсь установить фокус доступности (фокус с возможностью касания), используя UIAccessibilityLayoutChangedNotification на кнопке элемента UIAlertView. Чтобы сохранить ссылку на кнопку, это было реализовано в приведенном ниже коде:

UIAlertView *alert = [[[UIAlertView alloc] init] autorelease];
alert.delegate = self;
[alert setTitle:@"Title"];
[alert setMessage:@"Message"];

[alert addButtonWithTitle:@"Button"];
UIButton *yesButton = [alert.subviews lastObject];
[yesButton setHidden:NO];

myButton = [[UIButton buttonWithType:UIButtonTypeCustom] autorelease];
[myButton retain];
[alert addSubview:myButton];
[alert show];

[myButton setAccessibilityLabel:@"This is my button"];
[myButton setFrame:yesButton.frame];

[alert show];

Если VoiceOver запущен, я хочу, чтобы фокус был на кнопке, а не на элементе заголовка. Итак, я делаю это, когда отображается окно предупреждения:

if(UIAccessibilityIsVoiceOverRunning()){
    UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, myButton);
}

Тем не менее, метка доступности кнопки считывается VoiceOver («это моя кнопка»), но фокус, который можно нажимать, не устанавливается на кнопку, а остается на элементе заголовка UIAlertView


person Royston Yinkore    schedule 31.12.2014    source источник


Ответы (1)


Вы уверены, что хотите сразиться с VoiceOver? Пользователи могут перемещаться очень быстро, отчасти благодаря согласованности, с которой VoiceOver просматривает пользовательские интерфейсы. Старайтесь не мешать им, изменяя настройки по умолчанию.

Тем не менее, вы можете переопределить фокус VoiceOver по умолчанию, отправив уведомление об изменении макета после появления окна предупреждения. Попробуйте сделать это из -didPresentAlertView: вашего UIAlertViewDelegate. Вам также может потребоваться немного подождать, прежде чем публиковать уведомление, чтобы убедиться, что представление завершено и что VoiceOver заметил. dispatch_async() отлично подходит для этой цели.

person Justin    schedule 02.01.2015
comment
Спасибо за Ваш ответ. То, что вы предложили, действительно, и я уже реализовал [self performSelector:@selector(readOutEmergencyCallAnnouncement) withObject:self afterDelay:4.0f]; для запуска UIAccessibilityPostNotification, который, по сути, будет делать то же самое, что и dispatch_async(). Как бы то ни было, фокус по-прежнему не устанавливается. Как вы сказали, мне, возможно, придется вернуться к клиенту, чтобы не нарушать соглашение iOS - person Royston Yinkore; 05.01.2015