我在屏幕上有一堆按钮,这些按钮直观地定位,但不是由VoiceOver以直观的顺序读取的 . 这是因为某些按钮(如向上和向下)位于彼此的上方和下方 . 然而,画外音似乎开始从左到右,从上到下阅读 .
这导致画外音在“向上”之后读取“向上”右侧的按钮,而不是在之后立即读取“向下” .
如何强制画外音读取我想要阅读的按钮?我应该提一下,我正在使用画外音上的滑动到循环元素功能 .
我的所有按钮都是UIView和UIButton的子类 . 这是我使用的按钮启动器的示例 . 忽略像素数 - 我知道这是不好的形式,但我现在处于紧张状态:
UIButton* createSpecialButton(CGRect frame,
NSString* imageName,
NSString* activeImageName,
id target,
SEL obClickHandler)
{
UIButton* b = [UIButton buttonWithType:UIButtonTypeCustom];
[b setImage:[GlobalHelper nonCachedImage:imageName ofType:@"png"]
forState:UIControlStateNormal];
[b setImage:[GlobalHelper nonCachedImage:activeImageName ofType:@"png"]
forState:UIControlStateHighlighted];
[b addTarget:target action:obClickHandler forControlEvents:UIControlEventTouchUpInside];
b.frame= frame;
return b;
}
- (UIButton *) createSendButton {
CGFloat yMarker = 295;
UIButton* b = createSpecialButton(CGRectMake(160, yMarker, 70, 45),
@"Share_Btn",
@"Share_Selected_Btn",
self,
@selector(sendAction));
b.accessibilityHint = @"Send it!";
b.accessibilityLabel = @"Stuff for voiceover to be added";
[self.view addSubview:b];
return b;
}
8 回答
您可以更改视图的accessibilityElements数组的顺序设置:
要么
如果需要以编程方式设置交互:
如果视图被隐藏,则语音将不会通过它 .
在Swift中,您只需设置view的accessiblityElements数组属性:
view.accessibilityElements = [view1, view2, view3]
//您希望拥有的订单我尝试了Wesley's answer设置
accessibilityElements
的数组,但它对我不起作用 .Apple有一些文档Enhancing the Accessibility of Table View Cells,代码中有一个例子 . 基本上,您将单元格的可访问性标签(父视图)设置为子视图的可访问性标签的值 .
这对我有用 .
我想你可以在故事板中做到这一点 . VoiceOver顺序由文档大纲中的视图顺序决定 .
只需按正确的顺序拖放视图层次结构中的视图即可 .
编辑:
对不起,我不能发布屏幕直到10声望 . 在故事板中,文档大纲是左侧区域,其中列出了包含子视图的场景 . 在这里,子视图按顺序排列 . 当您更改此顺序时,VoiceOver的阅读顺序将会更改 .
我知道这是一个旧线程,但我发现最简单的方法是将UIView作为子类(Swift 3) . 然后只需将故事板中的主要UIView类型修改为AccessibiltySubviewsOrderedByTag,并更新要按顺序读取的每个子视图中的标记 .
class AccessibilitySubviewsOrderedByTag:UIView {
}
最简单的答案在于创建一个包含按钮的
UIView
子类,并对来自系统的可访问性调用做出不同的响应 . 这些重要的电话是:我已经看过其中一些问题了,但是我还没有看到如何重新排序VoiceOver焦点的一般示例 . 所以这里是一个如何创建
UIView
子类的示例,该子类通过标记将其可访问的子视图公开给VoiceOver .AccessibilitySubviewsOrderedByTag.h
AccessibilitySubviewsOrderedByTag.m
现在只需将按钮包含在此视图的实例中,并将按钮上的tag属性设置为焦点顺序 .
我昨天找到了方便的方式 . 类似于@TejAces的回答 . 制作一个新的swift文件,然后将这些内容复制到其中 .
将UIView(包含要重新排序的视图)的类设置为ReorderAccessibilityByStoryBoardView . 然后,您可以通过重新排序故事板的视图列表来重新排序它们 .
由于子视图在StackView / ScrollView中不包含视图,因此您需要在此文件中创建一个独立的类 . 如下面的ReorderAccessibilityByStoryBoardStackView .
使用这些代码,您还可以通过按特定顺序添加视图来重新排序代码中添加的视图 .
这不直接回答原始问题,但它回答了问题的 Headers :
当我想让VoiceOver向下滑动一列时,我一直在使用
shouldGroupAccessibilityChildren
set的列的包含视图 .我希望我早些时候知道这一点,因为将容器追溯到自动布局情况可能会很痛苦......