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

Jas*_*son 9 iphone ipod-touch first-responder ios voiceover

我正在使用我的iPhone应用程序.VoiceOver令人印象深刻.当用户使用VoiceOver时,它会自动读取屏幕上的项目,并允许用户双击屏幕上的任意位置以选择该项目.但是,我希望VoiceOver以特定顺序读取项目,但它始终以UINavigationBar项目(包括后退按钮)开头.我不希望这些项目根本不被阅读,我只想从一个特定的项目开始.是否有VoiceOver相当于"firstResponder"?

Dav*_*ist 6

有一个叫做的协议UIAccessibilityContainer是由NSObject实现的.它使您可以使用以下三种方法自定义容器行为:

  • accessibilityElementCount
  • accessibilityElementAtIndex:
  • indexOfAccessibilityElement:

如果您有一个主视图,您想要控制辅助功能元素的顺序,您只需实现这三个方法并返回合适的视图/索引.还有一件事是容器视图本身不能成为可访问性元素,因此您应该覆盖isAccessibilityElement:并返回NO;

- (BOOL)isAccessibilityElement {
    return NO;
}
Run Code Online (Sandbox Code Playgroud)

示例实现

我建议您按照希望它们出现的顺序拥有所有视图的数组,或者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];
}
Run Code Online (Sandbox Code Playgroud)

标记的元素

我假设您的子视图从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;
}
Run Code Online (Sandbox Code Playgroud)


Dav*_*ham 0

在某些情况下,在一项上设置 UIAccessibilityTraitSummaryElement 可以实现此目的。(我的游戏似乎太动态了,这没有多大帮助。)