Iphone 以编程方式确定VoiceOver读取UIView项的顺序

Iphone 以编程方式确定VoiceOver读取UIView项的顺序,iphone,ios,ipod-touch,first-responder,voiceover,Iphone,Ios,Ipod Touch,First Responder,Voiceover,我正在使我的iPhone应用程序可访问。画外音给人留下了深刻的印象。当用户使用VoiceOver时,它会自动读取屏幕上的项目,并允许用户双击屏幕上的任何位置以选择该项目。但是,我希望VoiceOver以特定的顺序阅读项目,但它总是以UINavigationBar项目开始,包括back按钮。我不希望这些项目不被阅读,我只想从一个特定的项目开始。是否存在与“firstResponder”等效的画外音?在某些情况下,在一个项目上设置UIAccessibilityTraitSummaryElement可

我正在使我的iPhone应用程序可访问。画外音给人留下了深刻的印象。当用户使用VoiceOver时,它会自动读取屏幕上的项目,并允许用户双击屏幕上的任何位置以选择该项目。但是,我希望VoiceOver以特定的顺序阅读项目,但它总是以UINavigationBar项目开始,包括back按钮。我不希望这些项目不被阅读,我只想从一个特定的项目开始。是否存在与“firstResponder”等效的画外音?在某些情况下,在一个项目上设置UIAccessibilityTraitSummaryElement可以做到这一点。(我的游戏似乎太有活力了,对此没有多大帮助。)

是的 NSObject实现了一个名为
UIAccessibilityContainer
的协议。它使您能够使用以下三种方法自定义容器行为:

  • accessibilitylementcount
  • accessibilitylementindex:
  • indexOfAccessibilityElement:
如果您有一个主视图,希望在其中控制可访问性元素的顺序,那么只需实现这三种方法并返回合适的视图/索引。还有一件事是容器视图本身不能是可访问性元素,因此您应该重写
isAccessibilityElement:
并返回
NO

- (BOOL)isAccessibilityElement {
    return NO;
}

示例实现 我建议您要么按照希望视图显示的顺序设置所有视图的数组,要么使用
标记
属性(如果您不将其用于任何其他内容)。协议的实现变得超级简单

元素数组 我假设您有一个名为
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;
}
-(NSInteger)可访问性YelementCount{
返回self.subviews.count;
}
-(id)可访问性指数:(NSInteger)索引{
//不是说self应该有标记计数,否则它会
//为该标记返回自身,而不是您希望它返回的元素。
返回[self-viewWithTag:index];
}
-(NSInteger)indexOfAccessibilityElement:(id)元素{
返回((UIView*)元素).tag;
}

或者可能不是-我可能误解了UIAccessibilityTraitSummaryElement,它可能只是屏幕输入时所说的内容。这与重点项目不同。