如何在Mac上为VoiceOver实施accessibilityCustomActions?

时间:2019-02-24 13:22:43

标签: swift macos accessibility voiceover

我有一个按钮,可以响应各种鼠标单击(常规单击,右键单击,Ctrl +单击,Option +单击,Command +单击...),以显示不同的弹出菜单。由于VoiceOver用户使用实际的物理鼠标会很烦人,因此我想将它们映射到不同的VoiceOver操作。

但是,我没有得到预期的结果。有人可以帮助我更好地了解我所缺少的吗?这是我到目前为止发现的。

如果我继承NSButton的子类并覆盖以下函数,则它们可以正常工作。除了一件奇怪的事。如果按vo + command + space弹出可用操作列表,则VoiceOver会说“操作1”而不是“显示菜单”。

override func accessibilityPerformPress() -> Bool { 
    print("Pressed!") 
    return true 
}

override func accessibilityPerformShowAlternateUI() -> Bool { 
    print("Show Alternate UI") 
    return true 
} 

override func accessibilityPerformShowMenu() -> Bool { 
    print("Show Menu") 
    return true 
} 

在同一个NSButton子类中,如果我也重写accessibilityCustomActions函数,则当我按vo + command + space时,“做某事”永远不会出现在可用操作列表中。

override func accessibilityCustomActions() -> [NSAccessibilityCustomAction]? { 
    let custom = NSAccessibilityCustomAction(name: "Do Something", target: self, selector: #selector(doSomething)) 
    return [custom] 
} 

@objc func doSomething() -> Bool { 
    print("Done something.") 
    return true 
} 

如果我继承了NSView而不是NSButton的子类,并且重写了#1中的相同功能,则一切正常。与第一种情况不同,即使VoiceOver正确地为accessibilityPerformShowMenu中的操作说“显示菜单”,而不是“操作1”。

在同一NSView子类中,如果我与accessibilityCustomActionsaccessibilityPerformPressaccessibilityPerformShowMenu一起覆盖accessibilityPerformShowAlternateUI,则“做某事”不会出现在操作列表中。

但是,如果我只是自己覆盖accessibilityCustomActions而没有accessibilityPerformPressaccessibilityPerformShowMenuaccessibilityPerformShowAlternateUI的话,“做某事”确实会出现在操作列表中。

我尝试创建另一个名为“ Press”的动作,该动作在按下vo + space时会执行相同的操作,并且包含在返回值accessibilityCustomActions中。但是,Vo + space不会触发该操作。相反,我必须按vo + command + space,然后选择“按”。我猜该动作的名称仅为“ Press”,但实际上并没有连接到vo + space。我不确定如何实际执行特定的自定义操作来响应vo + space。

如果有人可以帮助我将accessibilityCustomActions以及accessibilityPerformPressaccessibilityPerformShowMenuaccessibilityPerformShowAlternateUI一起实施到NSButton中,我将不胜感激。

非常感谢!

1 个答案:

答案 0 :(得分:0)

问题是您在 NSButton 而不是 NSButtonCell 上覆盖了这些 AX 方法。对于几乎所有与 NSControl 中的可访问性有关的事情,您都需要处理相关的 NSCell。如果您使用上面编写的自定义操作代码并将其粘贴到按钮使用的 NSButtonCell 的子类中,则它会起作用。