0

我正在使用NSCollectionView水平布局自定义视图。每个都NSCollectionViewItem托管一个NSView类似于复选框的自定义。这些自定义子视图自己支持可访问性(通过覆盖所需的可访问性方法,例如accessibilityRoleaccessibilityLabel)。

但是,我似乎无法将这些自定义视图提升为主要的 UI 视图,以便可以直接访问它们。当我使用 Accessibility Inspector 进行检查时,每个集合视图项似乎都是 aGroup并且似乎无法自动按下按钮,例如,因为自定义视图对其不可见。

我尝试NSAccessibilityButton在集合视图项上实现,但是我不知道要返回什么accessibilityParent()- 默认情况下似乎NSCollectionViewItem返回父集合视图部分,但如果没有子类化 NSCollectionView 及其布局,这是不可访问的。

以下内容也无济于事:

  public override var accessibilityFocusedUIElement: Any? {
    return self.customView
  }

这永远不会被调用。问题是,如何在使用NSCollectionView/时增加对可访问性的支持NSCollectionViewItem?我只是希望显示其子视图之一,以便自动化程序或键盘大师等应用程序可以访问它。

4

1 回答 1

0

不确定这是一种解决方法还是唯一可能的解决方案,但这就是我让它工作的方式:

  1. 创建一个新的可访问性代理类,可以转发与可访问性相关的查找
  2. 将此类设置为view` NSCollectionViewItemloadView() 中的
  3. 将呼叫转发到“可访问”的子视图

这是我的代理类:

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?()
  }
}
于 2021-05-22T20:06:27.897 回答