对于没有标题的NSButton(仅图像),如何更改VoiceOver读取的内容?

时间:2011-12-07 22:23:16

标签: macos accessibility nsbutton voiceover

我有几个NSButtons只是图像,并且完全以编程方式设置。当VoiceOver读取这些按钮时,它们会为每个按钮显示“未选中复选框”。我想为VoiceOver设置一个属性来读取更具描述性(出于辅助目的),但我无法在按钮上设置title属性,因为标题将会显示(我只想显示图标) )。

我尝试使用

[self.button accessibilitySetOverrideValue:title forAttribute:NSAccessibilityDescriptionAttribute];

但没有改变。我也尝试过NSAccessibilityTitleAttribute,NSAccessibilityRoleDescriptionAttribute和NSAccessibilityRoleAttribute没有运气。我做错了吗?

感谢。

2 个答案:

答案 0 :(得分:5)

看起来原始代码是正确的,但它仅在按钮单元格(而不是按钮本身)上调用时才有效。以上内容改为:

[self.button.cell accessibilitySetOverrideValue:title forAttribute:NSAccessibilityDescriptionAttribute];

其中title仍为NSString*。假设标题为@"Test",上述代码会使VoiceOver读取“未经检查的复选框”。我发现它没有阅读“未选中复选框”部分的唯一方法是清除其他三个属性:NSAccessibilityTitleAttributeNSAccessibilityRoleDescriptionAttributeNSAccessibilityRoleAttribute。我用@" "覆盖了每一个。如果有人有一个更优雅的解决方案来忽略这些字段,请告诉我。现在,我会给这个回答。

答案 1 :(得分:1)

在Yosemite(10.10)中,您可以使用method-based accessibility API执行此操作:

例如,在自定义NSView中:

class CustomTabBarGroup: NSView, NSAccessibilityGroup {

    required init?(coder: NSCoder) {
        super.init(coder: coder)

        // We function as a tab group — closest in role is a radio button group
        self.setAccessibilityRole(NSAccessibilityRadioGroupRole)

        // You can also override what the role normally reads:
        self.setAccessibilityRoleDescription("Tab bar")
    }

    //...
}

并且,可能在一个开关按钮上,其行为类似于您应用中的单选按钮(例如,几个中的选定标签):

class CustomTabBarButton: NSButton {

    required init?(coder: NSCoder) {
        super.init(coder:coder)
        self.setAccessibilityRole(NSAccessibilityRadioButtonRole)
    }

    //...
}

有关采用此类角色的非标准外观的控件示例,请查看iPhoto的“调整”面板。右侧标签栏带有"快速修复","效果"和"调整" tabs实际上是一个带单选按钮的单选按钮组。此外,效果选项卡下的效果样本还包括步进器,复选框和按钮。