Программно определить порядок, в котором элементы UIView должны быть прочитаны VoiceOver - PullRequest
9 голосов
/ 08 августа 2011

Я делаю свое приложение для iPhone доступным. VoiceOver довольно впечатляет. Когда пользователь использует VoiceOver, он автоматически считывает элементы на экране и позволяет пользователю дважды нажать в любом месте экрана, чтобы выбрать этот элемент. Однако я хочу, чтобы VoiceOver считывал элементы в определенном порядке, но он всегда начинается с элементов UINavigationBar, включая кнопку «Назад». Я не хочу, чтобы эти элементы , а не вообще читались, я просто хочу начать с определенного элемента. Существует ли VoiceOver-эквивалент «firstResponder»?

Ответы [ 2 ]

6 голосов
/ 25 марта 2013

Да

Существует протокол под названием UIAccessibilityContainer, который реализуется NSObject.Он позволяет настроить поведение контейнера с помощью этих трех методов:

  • accessibilityElementCount
  • accessibilityElementAtIndex:
  • indexOfAccessibilityElement:

Если у вас есть главное представление, где вы хотите управлять порядком элементов специальных возможностей, вы просто реализуете эти три метода и возвращаете подходящее представление / индекс.Еще одна вещь заключается в том, что контейнерное представление не может быть самим элементом доступности, поэтому вы должны переопределить isAccessibilityElement: и вернуть NO;

- (BOOL)isAccessibilityElement {
    return NO;
}

Пример реализации

Я предлагаюу вас либо есть массив всех представлений в том порядке, в котором вы хотите, чтобы они отображались, либо используйте свойство tag, если вы не используете его для чего-либо еще.Реализация протокола становится очень простой.

Массив элементов

Я предполагаю, что у вас есть массив с именем accessibleElements, в котором элементы хранятся в правильном порядке.

- (NSInteger)accessibilityElementCount {
    return self.accessibleElements.count;
}

- (id)accessibilityElementAtIndex:(NSInteger)index {
    return self.accessibleElements[index]; 
}

- (NSInteger)indexOfAccessibilityElement:(id)element {
    return [self.accessibleElements indexOfObject:element];
}

Помеченные элементы

Я предполагаю, что ваши подпредставления помечены непрерывно от 0 до количества подпредставлений.

- (NSInteger)accessibilityElementCount {
    return self.subviews.count;
}

- (id)accessibilityElementAtIndex:(NSInteger)index {
    // Not that self should have a tag<0 or tag>count otherwise it will 
    // return itself for that tag instead of the element you want it to.
    return [self viewWithTag:index]; 
}

- (NSInteger)indexOfAccessibilityElement:(id)element {
    return ((UIView *)element).tag;
}
0 голосов
/ 06 октября 2011

В некоторых случаях установка UIAccessibilityTraitSummaryElement для одного элемента может сделать это.(Моя игра кажется слишком динамичной, чтобы это сильно помогло.)

...