Специальные возможности для iOS, проблема с порядком чтения VoiceOver

введите описание изображения здесь

Можно ли изменить порядок, в котором функция VoiceOver для специальных возможностей в iPad считывает элементы при выполнении жеста «Прокрутить вниз двумя пальцами»?

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

Ярлык 1 -> Ярлык 2 -> Кнопка -> Ярлык 3

Можно ли изменить порядок на,

Ярлык 1 -> Ярлык 2 -> Ярлык 3 -> Кнопка


person Breakpoint    schedule 30.10.2012    source источник


Ответы (4)


Самый быстрый способ добиться этого в вашем примере - поместить три метки в прозрачный подкласс UIView, который будет служить контейнером для ваших меток. Этот подкласс необходимо правильно настроить, чтобы VoiceOver знал, как его интерпретировать. Если ваша цель развертывания iOS6, тогда вы можете просто ответить на вопрос «следует ли группировать дочерние элементы доступности» в этом подклассе.

-(BOOL)shouldGroupAccessibilityChildren{
    return YES;
}

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

-(BOOL)isAccessibilityElement{
    return NO;
}
-(NSInteger)accessibilityElementCount{
    return self.subviews.count;
}
-(id)accessibilityElementAtIndex:(NSInteger)index{
    return [self.subviews objectAtIndex:index];
}
-(NSInteger)indexOfAccessibilityElement:(id)element{
    return [self.subviews indexOfObject:element];
}

Я протестировал этот пример кода, и он делает то, что вы ищете, если вам нужны пояснения, добавьте комментарий. Всегда рад помочь сделать вещи доступнее.

person NJones    schedule 30.10.2012
comment
Спасибо за такой ответ. Но, похоже, shouldGroupAccessibilityChildren не вызывается. - person Breakpoint; 31.10.2012
comment
@Vittal shouldGroup.. будет вызываться только устройствами iOS6, а не всеми приложениями, созданными с ›= 6 SDK. Также убедитесь, что представление, содержащее ваши метки, относится к вашему настраиваемому классу в xib или раскадровке, используя инспектор идентичности. Сообщите мне, если у вас все еще есть проблемы. - person NJones; 31.10.2012
comment
ах, часть настраиваемого класса - это то, чего мне не хватало. глупая ошибка. Теперь это работает. Большое спасибо. и да, я тестировал iOS6. Мне нужно достать версию ниже 6, чтобы протестировать остальное. Так что просто добавление кода для iOS 6 ниже в настраиваемый класс будет правильным? - person Breakpoint; 31.10.2012
comment
@Vittal Я тестировал этот код на iPod touch 4-го поколения под управлением iOS6 и iPad 1-го поколения под управлением 5.1. Интересно, что 4 метода до 6.0 были вызваны обеими версиями ОС при реализации, даже если реализовано shouldGroup... Мое личное мнение - оставить shouldGroup.. в вашем классе. это не опасно, если работает до 6.0, он просто не будет вызываться. Но если Apple что-то оптимизирует в будущем, ваш код будет готов. - person NJones; 31.10.2012
comment
Я заметил такое же поведение :) Однако методы до iOS6, похоже, не работают :( Протестировано на iPad 5.1 второго поколения. - person Breakpoint; 31.10.2012
comment
@Vittal Не с ума сойти. Я бы, вероятно, попытался удалить приложение и переустановить, в случае, если изменение не было загружено на устройство. Кроме того, попробуйте изменить цвет фона контейнера на сплошной, иногда очистка выглядит забавно. Я не смогу разобраться в этом несколько часов, но я не могу объяснить разницу между iPad 1 и iPad 2. Поведение такое же, как без представления контейнера, или что-то другое? - person NJones; 31.10.2012
comment
Я считаю, что тоже пытался удалить. Позвольте мне попробовать еще раз. Да, для 5.1 кажется, что нет никаких изменений с контейнером представления, содержащим метки, или без него. И спасибо, что проявили такой интерес к этому вопросу. - person Breakpoint; 31.10.2012
comment
@Vittal Я просто не могу воспроизвести вашу проблему с iPad2 на своем iPad1, и у меня нет iPad2, и если бы я это сделал, он, вероятно, уже работал бы с 6.0. Я пробовал строить с Xcode 4.4.1 и 4.5.1 и запускать на своем iPad с 5.1.1. Единственное, что я хотел бы спросить, это взломан ли ваш iPad2? Я слышал, что процесс взлома иногда приводит к сбоям во вспомогательных фреймворках. - person NJones; 01.11.2012
comment
Нет разницы. Проблема в том, что у меня не всегда есть доступ к iPad с ОС 5.1, поэтому сложно внести изменения в код и сразу проверить. И нет, его не взломали. - person Breakpoint; 02.11.2012

Я попытался установить shouldGroupAccessibilityChildren на YES, но у меня это не сработало.

Что действительно сработало для меня, так это установка метки доступности родительского представления напрямую (потому что я хотел, чтобы все элементы были прочитаны одним движением / одним жестом VoiceOver).

[cell setAccessibilityLabel:[NSString stringWithFormat:@"%@, %@", cityLabel, temperatureLabel]];

Приведенный выше фрагмент кода взят из документации Apple Повышение доступности ячеек табличного представления

person ChrisJF    schedule 22.12.2015

В Swift достаточно присоединить IBOutlet к родительскому UIView и установить для shouldGroupAccessibilityChildren значение true.

abc.shouldGroupAccessibilityChildren = true

Я заметил, что если также установить isAccessibilityElement = true, группировка не вступит в силу. Точно так же установка флажка доступности в раскадровке или xib также предотвратит группировку.

person Stamp    schedule 31.10.2017

Я думаю, вы можете сделать это в раскадровке. Порядок VoiceOver определяется порядком просмотров в структуре документа.

Просто перетащите представления в иерархии представлений в правильном порядке.

person StefanJ    schedule 16.02.2015
comment
Они расположены в правильном порядке, но VoiceOver все равно не читает их правильно. Я использую iOS 9, и не знаю, изменилось ли что-то с тех пор. - person user1366265; 07.09.2016
comment
Нет, обычно они читаются на экране слева направо. - person David Dunham; 01.12.2016