我试图在我的应用程序中隐藏VoiceOver中的多个元素,这样他们就不会被屏幕阅读器大声朗读。在iOS上,我将isAccessibilityElement
设置为NO
,但这对OSX没有影响。从VoiceOver中隐藏元素的正确方法是什么?
例如,我在视图中包含一系列标签,如果VoiceOver分别说出这些标签就毫无意义。我想在容器视图上设置accessibilityLabel
来描述嵌套在其中的所有标签。但如果我这样做,内部的标签仍然由VoiceOver读出。
答案 0 :(得分:4)
在macOS中,为accessibilityElement
,NO
和NSButton
设置NSTextField
为NSImageView
无效。这是因为它们是控件 - 它们继承自NSControl
。要使其适用于控件,您必须改为控件的 单元格 。
在Objective-C项目中,我将几个Cocoa控件子类化。例如,每当我想要VoiceOver跳过图像视图时,我将其在Interface Builder中的自定义类设置为:
/*!
@brief Image view which will be skipped over by VoiceOver
@details Be careful that you *really* want the view to be skipped over by
VoiceOver, because its meaning is conveyed in a better, non-visual way,
elsewhere. Remember that not all VoiceOver users are completely blind.
*/
@interface SSYNoVoiceOverImageView : NSImageView {}
@end
@implementation SSYNoVoiceOverImageView
- (void)awakeFromNib {
self.cell.accessibilityElement = NO;
}
@end
答案 1 :(得分:2)
如果您将元素的辅助功能角色设置为空字符串,则Voice Over将无法检测到它。我不得不在我的应用程序中隐藏一些NSImageView元素,因为它们的文件名被读出来并且让VO用户感到困惑。
无论
[element accessibilitySetOverrideValue:@"" forAttribute:NSAccessibilityRoleAttribute];
或者
[[element cell] accessibilitySetOverrideValue:@"" forAttribute:NSAccessibilityRoleAttribute];
应该这样做。
我知道Apple是一种基于辅助功能API的新方法,但它仅适用于OS X 10.10以及我正在工作的应用程序需要与10.9兼容。
如果您可以使用新API
[element setAccessibilityRole:@""];
或[[element cell] setAccessibilityRole:@""];
应该做同样的事情。