我正在使用我的iPhone应用程序。 VoiceOver令人印象深刻。当用户使用VoiceOver时,它会自动读取屏幕上的项目,并允许用户双击屏幕上的任意位置以选择该项目。但是,我希望VoiceOver以特定顺序读取项目,但它始终以UINavigationBar项目(包括后退按钮)开头。我不想要阅读不这些项目,我只想从一个特定的项目开始。是否有VoiceOver相当于“firstResponder”?
答案 0 :(得分:6)
有一个名为UIAccessibilityContainer
的协议,由NSObject实现。它使您能够使用以下三种方法自定义容器行为:
accessibilityElementCount
accessibilityElementAtIndex:
indexOfAccessibilityElement:
如果您有一个主视图,您想要控制辅助功能元素的顺序,您只需实现这三个方法并返回合适的视图/索引。还有一件事是容器视图本身不能成为辅助功能元素,因此您应该覆盖isAccessibilityElement:
并返回NO
;
- (BOOL)isAccessibilityElement {
return NO;
}
我建议您按照希望它们显示的顺序显示所有视图的数组,或者如果不将其用于其他任何内容,则使用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];
}
我假设您的子视图从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;
}
答案 1 :(得分:0)
在某些情况下,在一个项目上设置UIAccessibilityTraitSummaryElement可以执行此操作。 (我的游戏似乎过于动态,无法提供太多帮助。)