首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSCollectionViewItem和对辅助功能的支持

NSCollectionViewItem和对辅助功能的支持
EN

Stack Overflow用户
提问于 2021-05-22 23:56:14
回答 1查看 57关注 0票数 0

我使用NSCollectionView来水平布局自定义视图。每个NSCollectionViewItem都有一个自定义的NSView,它的作用就像一个复选框。这些自定义子视图本身支持辅助功能(通过覆盖所需的辅助功能方法,如accessibilityRoleaccessibilityLabel等)。

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

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

以下内容也没有帮助:

代码语言:javascript
复制
  public override var accessibilityFocusedUIElement: Any? {
    return self.customView
  }

这永远不会被调用。问题是,在使用NSCollectionView / NSCollectionViewItem时,如何添加对可访问性的支持?我只是想让它的一个子视图浮出水面,这样它就可以被automator或诸如键盘大师之类的应用程序访问。

EN

回答 1

Stack Overflow用户

发布于 2021-05-23 04:06:28

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

  1. 创建可以转发与辅助功能相关的查找的新辅助功能代理类
  2. 将此类设置为对“可访问”子视图

view调用中的NSCollectionViewItem

下面是我的代理类:

代码语言:javascript
复制
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?()
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67651526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档