macos - 将 NSAccessibilityElement 添加到现有 NSView

标签 macos cocoa accessibility nsview appkit

我想使用MacOS accessibility feature我的应用程序呈现自己的自定义 UI(即不使用 Cocoa)。为此,我实现了与我绘制的每个小部件关联的子类 NSAccessibilityElement 树。 根 UI 容器托管在外部提供给我的应用程序的 NSView 内(我的应用程序是一个插件)。现在我需要将我的 NSAccessibilityElement 树附加到主机提供的现有 NSView 上。

Apple documentation推荐两种方法来实现这一目标:

  • 重新实现父级的 accessibilityChildren属性以包含自定义元素(例如 Qt 使用此方法)。不幸的是,我自己没有创建父 NSView ,它是从外部注入(inject)的。
  • 调用 accessibilityAddChildElement方便方法。但是当我在提供的 NSView 对象上调用它时,我收到一个异常,它不响应此方法。

NSAccessibilityElement 树附加到现有 NSView 的正确方法是什么?

最佳答案

所以我最终对 NSView 进行子类化以捕获顶级 NSAccessibilityElement。重写 - (NSArray*)accessibilityChildren 方法返回捕获的辅助功能元素作为其子元素之一:

@interface AccessibilityRootView : NSView
- (instancetype)initWithAccessibilityElement: (NSAccessibilityElement*)anElement;
@end

@implementation AccessibilityRootView
{
    NSAccessibilityElement* element;
}

- (instancetype) initWithAccessibilityElement: (NSAccessibilityElement*)anElement
{
    self = [super init];

    if (self)
        element = anElement;

    return self;
}

- (NSArray*) accessibilityChildren
{
    NSArray<NSAccessibilityElement*> *children = [super accessibilityChildren];

    int numKids = (int)[children count] + 1;
    NSMutableArray<NSAccessibilityElement*> *kids = [NSMutableArray<NSAccessibilityElement*> arrayWithCapacity:numKids];

    for (id object in children)
        [kids addObject:object];

    [kids addObject: element];

    return NSAccessibilityUnignoredChildren (kids);
}
@end

然后,我将这个大小为零的子类 View 附加到主机提供的父 NSView:

NSView* hostView = /* host-provided NSView */;
AccessibilityRootView* accessibilityRootView = [[AccessibilityRootView alloc] initWithAccessibilityElement:(NSAccessibilityElement*)topLevelAccessibilityElement];
[hostView addSubview:accessibilityRootView];
[accessibilityRootView release];

此时,我的所有 NSAccessibilityElements 都已附加到位于主机提供的 View 中的零大小 View ,并且 MacOS 可以成功查询这些项目。

此外,每个 NSAccessibilityElement 必须正确实现其 - (NSRect)accessibilityFrame- (id)accessibilityHitTest:(NSPoint)点 以匹配我自定义绘制的 UI 小部件的屏幕位置。

关于macos - 将 NSAccessibilityElement 添加到现有 NSView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63062794/

相关文章:

macos - 简单的 Swift 函数返回错误

macos - 如何验证 macOS pkg 是否经过公证

cocoa - 关于 NSWindowController 和 NSPersistentDocument 核心数据教程的问题

ssl - 运行 HTTPS 网站时是否可以使用 CDN?

java - 服务器在建立后立即通过 FIN、ACK 和 RST 关闭 TCP 连接

python - 使用 Python 捕获 Mac OS X 系统音频输出

objective-c - OSX 上的鼠标操作

objective-c - 将 ARC 代码转换为非 ARC

html - 网页辅助功能 : Redundant link- Adjacent links go to the same URL for a tag <a href ="javascript:void(0)">

javascript - 修改元素的传统方法是什么,而屏幕阅读器(例如 :Jaws, VoiceOver)可以 'read it' ?