Делаем программный пользовательский интерфейс iOS полностью доступным

#iphone #ios #accessibility

#iPhone #iOS #Специальные возможности

Вопрос:

Я программно создаю UINavigationContoller для iOS и у меня возникают проблемы с тем, чтобы сделать его полностью доступным. В loadView я создаю main UIView и устанавливаю его как недоступный:

     - (void)loadView
    {
    CGRect viewRect = [[UIScreen mainScreen] applicationFrame];
    UIView *tmp = [[UIView alloc] initWithFrame:viewRect];
    [tmp setIsAccessibilityElement:NO];
  

Затем я добавляю дополнительные, UIViews которые содержат только фоновые изображения, а также устанавливаю их как недоступные. Все представления и элементы управления добавляются в «tmp» UIView , созданный выше. Вот пример «фонового» просмотра:

 UIImage* microphone = [UIImage imageNamed:@"microphone.jpg"];
    UIView* microphoneView = [[[UIView alloc] initWithFrame: CGRectMake(0,0,viewRect.size.width, microphone.size.height)] autorelease];
    [microphoneView setBackgroundColor:[UIColor colorWithPatternImage:microphone]];
    [microphoneView setIsAccessibilityElement:NO];
    [tmp addSubview:microphoneView];
  

Наконец, я добавляю UIButton , UILabel и UIButtonBarItem . Я добавляю эти последние, чтобы они находились на вершине иерархии представлений. Я добавляю к ним ярлыки доступности и характеристики. Вот UIButton :

 self.recordImage = [UIImage imageNamed: @"record_button.png"];
self.stopRecordImage = [UIImage imageNamed: @"stop_button.png"];
self.recordButton.accessibilityTraits |= UIAccessibilityTraitStartsMediaSession;
self.recordButton = [[UIButton alloc  ] initWithFrame: CGRectMake((viewRect.size.width - recordImage.size.width)/2 , (microphone.size.height   (grayBkg.size.height - recordImage.size.height)/2), recordImage.size.width, recordImage.size.height)];
[self.recordButton setIsAccessibilityElement:YES];
[self.recordButton setAccessibilityLabel:  @"toggle recording start"];
[self.recordButton setImage: recordImage forState:UIControlStateNormal];
[self.recordButton addTarget: self action:@selector(processButton:) forControlEvents:UIControlEventTouchUpInside];
[tmp addSubview:recordButton];
  

наконец

 ....
[self setView:tmp];
[tmp release];
  

Я действительно вызывал UIAccessibilityPostNotification ( UIAccessibilityScreenChangedNotification , nil); когда я помещаю это представление в стек.

При включенном voiceover, когда отображается представление, я могу провести пальцем по каждому из своих элементов ( UIButtonBarItem , UILabel и UIButton ) и сфокусировать их двойным касанием. Однако VoiceOver не передает никакой информации об элементах. Тестирование в симуляторе с инспектором доступности показывает метки, которые я установил с помощью aControl.accessibilityLabel = @»метка»;

Это представление используется для записи звука. Если я активирую кнопки и записываю звук, а затем остановлю запись, VoiceOver теперь будет произносить метки для элементов, когда я их фокусирую? Почему VoiceOver не передает информацию при первой загрузке представления? Любые подсказки приветствуются!

Я тестирую на iPad 2 с iOS 4.3.3.

Ответ №1:

Если вы хотите, чтобы ваше представление было недоступно, используйте:

 [microphoneView setUserInteractionEnabled:NO];  
  

Комментарии:

1. Спасибо, я пропустил это свойство. Однако добавление этого к представлениям, которые я не хотел включать в иерархию доступности, не влияет на поведение — информация о кнопке не передается, пока не будет вызвана хотя бы одна.

Ответ №2:

Это представление используется для записи звука. Проблема заключалась в том, что я устанавливал для категории AVSession значение AVAudioSessionCategoryRecord в методе viewDidLoad. Это приводило к тому, что VoiceOver не передавал информацию о просмотре. Я изменил код, чтобы установить категорию в AVAudioSessionCategoryRecord только при нажатии кнопки записи. И я установил для него значение AVAudioSessionCategoryPlayAndRecord по завершении записи. Вот поток, который полностью объясняет это:http://lists.apple.com/archives/accessibility-dev/2011/Jul/msg00002.html

Комментарии:

1. Похоже, что эта ссылка больше не отображает содержимое. Есть ли альтернативный способ получить информацию или краткое изложение деталей там? Спасибо!