Голосовая помощь UIButton по запросу с включенным VoiceOver

Я хотел бы спросить, как разработать голосовую помощь по запросу с включенной функцией VoiceOver.

У меня есть такой код для создания UIButton:

_myLocationButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[_myLocationButton setImage:[UIImage imageNamed:@"my_location_icon"] forState:UIControlStateNormal];
_myLocationButton.accessibilityLabel = @"My location";
_myLocationButton.accessibilityHint = @"Double tap to hear where You are, in which zone or near zone and floor information in building";
[_myLocationButton addTarget:self
                      action:@selector(myLocationButtonPressed)
            forControlEvents:UIControlEventTouchUpInside];

Теперь в методе myLocationButtonPressed у меня есть такой код:

UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, positionDescription);

Мой вопрос. Когда я пытаюсь дважды нажать, когда myLocationButton активен, VoiceOver говорит только: «Мое местоположение». Я бы хотел, чтобы после двойного нажатия я хотел услышать positionDescription, а не кнопку accessibilityLabel. Я знаю, что метод myLocationButtonPressed вызывается, но по неизвестной причине публикация события UIAccessibilityAnnouncementNotification ничего не делает, и я ничего не слышу.

Может кто-нибудь дать мне несколько советов, как подойти к такой проблеме.


person Marcin Kapusta    schedule 01.09.2015    source источник
comment
каково описание вашей должности?   -  person Teja Nandamuri    schedule 01.09.2015
comment
если это nsstring , вы можете дать это метке/подсказке доступности   -  person Teja Nandamuri    schedule 01.09.2015
comment
Метки доступности для NSString работают только при определенных обстоятельствах, обычно эта информация игнорируется.   -  person ChrisCM    schedule 02.09.2015


Ответы (1)


Единственный способ, который я обнаружил, чтобы объявления читались последовательно, — это опубликовать уведомление с задержкой. Эта функция должна помочь.

- (void)postVoiceOverAnnouncement:(NSString*)message withDelay:(int)seconds {
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(seconds * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, @"This will get read out");
    });
}

Даже с добавлением признака запуска медиа-сессии что-то все еще прерывает объявление. На что вы должны обратить внимание, так это на продолжительность вашей задержки. Если кто-то продолжит просматривать ваше приложение, он может прервать объявление. Хотя, поскольку в правильно доступном приложении эта информация должна быть доступна в другом месте, они должны иметь возможность найти ее снова. Это, конечно, просто полезное объявление, чтобы не смещать фокус на ничего не подозревающих пользователей VoiceOver :).

Еще одна проблема с вашим кодом, которую я заметил:

_myLocationButton.accessibilityHint = @"Double tap to hear where You are, in which zone or near zone and floor information in building";

Во-первых, браво за такие подробные подсказки! Однако вы не должны включать часть «Двойное касание, чтобы…». Пользователи умеют взаимодействовать с кнопками через VoiceOver. Это единственный способ взаимодействия с этим? Или можно также нажать Enter на внешней клавиатуре? Как насчет некоторых других гипотетических АТ, в которых жест выбора является каким-то другим взаимодействием... Насколько полезна эта подсказка для тех, кто использует доску Брайля??? Просто сообщите пользователям о последствиях взаимодействия с объектом, пусть АТ позаботится обо всем остальном.

person ChrisCM    schedule 02.09.2015
comment
Привет. Большое спасибо за Ваш ответ. Я нашел решение. Я устанавливаю accessibilityValue в UIButton, и значением является мое описание позиции. Это работает нормально. Когда пользователь дважды нажимает кнопку, значение вычисляется и устанавливается. Когда обратные вызовы accessibilityElementDidBecomeFocused или accessibilityElementDidLoseFocus вызываются в экземпляре UIButton, я устанавливаю для accessibilityValue значение nil. Это работает, но я думаю, что ваше решение тоже будет работать с задержкой. Я думаю, что часть «Двойное касание» в порядке, потому что iOS инструктирует пользователя таким же образом. - person Marcin Kapusta; 03.09.2015
comment
iOS не инструктирует пользователя таким же образом. Когда голос за кадром инструктирует пользователя таким образом, он вычисляет это объявление на основе характеристики, типа управления и т. д. Ключевое слово здесь заключается в том, что эту информацию добавляет голос за кадром, а не ваше приложение! Для озвучки так должно происходить это взаимодействие, а для какого-то другого АТ - нет. Если эта информация поступает из вашего приложения, вы не оставляете места другим AT для получения других инструкций. - person ChrisCM; 03.09.2015
comment
Что, если в будущей версии закадрового голоса жестом выбора будет смахивание вместо двойного нажатия? Ваша подсказка все еще полезна? - person ChrisCM; 03.09.2015
comment
Можете ли вы объяснить мне, как настроить черты UIButton, чтобы iOS VoiceOver автоматически говорил «Двойное касание», чтобы я установил подсказку без префикса «Двойное касание»? - person Marcin Kapusta; 03.09.2015
comment
Вы должны пометить свой объект чертой кнопки. Затем VoiceOver объявит кнопку со словом в своем объявлении. Объяснять им каждый раз, когда вы дважды нажимаете, чтобы щелкнуть, было бы все равно, что я говорю вам, как использовать мышь, чтобы нажимать кнопку, КАЖДЫЙ РАЗ, КОГДА ВЫ ВИДЕЛИ ОДНУ. Если бы вам приходилось искать это объяснение каждый раз, не замедлило бы оно вас значительно? Им не нужно никаких дополнительных инструкций, кроме знания того, что объект является кнопкой, и предоставление любых дальнейших инструкций противоречит рекомендациям Apple по доступности, а также требованию 4.1.2 WCag 2.0. - person ChrisCM; 03.09.2015