2015-07-20 234 views
3

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

例如,我在视图中包含一系列标签,如果它们由VoiceOver单独说出,那么这些标签是没有意义的。我想在容器视图上设置accessibilityLabel来描述嵌套在其中的所有标签。但是如果我这样做,里面的标签仍然会被VoiceOver读出。

回答

2

如果将元素的可访问性角色设置为空字符串,Voice Over将不会检测到它。我不得不在应用程序中隐藏一些NSImageView元素,因为他们的文件名正在被读出,这让VO用户感到困惑。

要么

[element accessibilitySetOverrideValue:@"" forAttribute:NSAccessibilityRoleAttribute];

否则

[[element cell] accessibilitySetOverrideValue:@"" forAttribute:NSAccessibilityRoleAttribute];

应该做的伎俩。

我知道苹果基于Accessibility API的新方法,但它只适用于OS X 10.10以上,我正在使用的应用程序需要与10.9兼容。

如果您可以使用新的API [element setAccessibilityRole:@""];[[element cell] setAccessibilityRole:@""];应该做同样的事情。

+1

实际上,[元素setAccessibilityRole:@“”]中的MacOS 10.12工作如本说明回答。但是,这种行为是无证的。在NSAccessibilityConstants.h中列出了几十个受支持的常量:NSAccessibilityUnknownRole,NSAccessibilityButtonRole,...。但他们中没有一个表示“不可访问”或“没有角色”,并且没有一个是空字符串。结论:这种行为可能会在未来的macOS版本中发生变化。 –

3

在macOS中,设置accessibilityElementNONSButtonNSTextFieldNSImageView确实没有任何影响。那是因为这些是控件 - 它们继承自NSControl。要使其适用于控件,则必须改为使用控件的单元格

在一个Objective-C项目中,我分类了几个Cocoa控件。例如,每当我想要一个图像以便由VoiceOver的被跳过,我在界面生成器设置它的定义类这样:

/*! 
@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