我使用NSCollectionView来水平布局自定义视图。每个NSCollectionViewItem都有一个自定义的NSView,它的作用就像一个复选框。这些自定义子视图本身支持辅助功能(通过覆盖所需的辅助功能方法,如accessibilityRole、accessibilityLabel等)。
但是,我似乎无法将这些自定义视图提升为主要的UI视图,以便可以直接访问它们。当我使用可访问性检查器进行检查时,每个集合视图项似乎都是一个Group,例如,似乎没有办法自动按下按钮,因为自定义视图对它不可见。
我尝试在集合视图项上实现NSAccessibilityButton,但是我不知道为accessibilityParent()返回什么-似乎在默认情况下,NSCollectionViewItem返回父集合视图部分,但这是不可访问的,除非对NSCollectionView及其布局进行子类化。
以下内容也没有帮助:
public override var accessibilityFocusedUIElement: Any? {
return self.customView
}这永远不会被调用。问题是,在使用NSCollectionView / NSCollectionViewItem时,如何添加对可访问性的支持?我只是想让它的一个子视图浮出水面,这样它就可以被automator或诸如键盘大师之类的应用程序访问。
发布于 2021-05-23 04:06:28
不确定这是一种变通方法还是唯一可能的解决方案,但这是我是如何让它工作的:
的view调用中的NSCollectionViewItem
下面是我的代理类:
import Foundation
import Cocoa
/// A wrapper view that acts as a proxy for re-directing accessibility-related lookups.
/// This can be useful in a `NSCollectionViewItem`, for example, to re-direct requests to a child view you'd like to suface as the main, accessible view.
public class BKProxyAccessibleButton: NSView {
public var isAccessibilityElementProxy: (()->Bool)? = nil
public var accessibilityFocusedUIElementProxy: (()->Any?)? = nil
public var accessibilityPerformPressProxy: (()->Bool)? = nil
public var accessibilityValueProxy: (()->NSNumber?)? = nil
public var accessibilityHelpProxy: (()->String?)? = nil
public var accessibilityLabelProxy: (()->String?)? = nil
}
// MARK:- Accessibility
extension BKProxyAccessibleButton: NSAccessibilityButton {
open override func accessibilityRole() -> NSAccessibility.Role? {
return .button
}
open override func accessibilityHelp() -> String? {
return accessibilityHelpProxy?()
}
open override func accessibilityLabel() -> String? {
return accessibilityLabelProxy?()
}
open override func accessibilityTitle() -> String? {
return accessibilityLabelProxy?()
}
open override func isAccessibilityElement() -> Bool {
return isAccessibilityElementProxy?() ?? false
}
open override var accessibilityFocusedUIElement: Any? {
return accessibilityFocusedUIElementProxy?()
}
open override func accessibilityPerformPress() -> Bool {
return accessibilityPerformPressProxy?() ?? false
}
@objc public override func accessibilityValue() -> Any? {
return accessibilityValueProxy?()
}
}https://stackoverflow.com/questions/67651526
复制相似问题