#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. Похоже, что эта ссылка больше не отображает содержимое. Есть ли альтернативный способ получить информацию или краткое изложение деталей там? Спасибо!