禁用/隐藏辅助功能元素

时间:2015-07-20 18:03:55

标签: macos voiceover

我试图在我的应用程序中隐藏VoiceOver中的多个元素,这样他们就不会被屏幕阅读器大声朗读。在iOS上,我将isAccessibilityElement设置为NO,但这对OSX没有影响。从VoiceOver中隐藏元素的正确方法是什么?

例如,我在视图中包含一系列标签,如果VoiceOver分别说出这些标签就毫无意义。我想在容器视图上设置accessibilityLabel来描述嵌套在其中的所有标签。但如果我这样做,内部的标签仍然由VoiceOver读出。

2 个答案:

答案 0 :(得分:4)

在macOS中,为accessibilityElementNONSButton设置NSTextFieldNSImageView无效。这是因为它们是控件 - 它们继承自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:@""];应该做同样的事情。