UIAccessibilityNotificationQuestion

UIAccessibilityNotificationQuestion

我是 iOS 辅助功能区域的新手,我正在尝试使用此 UIAccessibilityNotification 功能,但它没有像我想象的那样工作。我写了一个非常简单的应用程序,只有一个按钮,当你点击按钮时,这个方法就会被调用。

- (IBAction)announce:(id)sender {
    UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification,
                                @"Speak this out loud");
}

据我了解,当您单击按钮时,画外音会显示 "Speak this out loud",但它会显示按钮名称。谁能告诉我代码有什么问题或为什么我使用错误?

为了清楚起见,我双击了按钮。当您单击按钮时,它会读取按钮名称和特征 ("button"),而当您双击它时,它只会读取按钮名称。

感谢@ChrisCM 的回答。延迟公告使其生效。

@IBAction func announce(sender: AnyObject) {
    let dispatchTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(2 * Double(NSEC_PER_SEC)))

    dispatch_after(dispatchTime, dispatch_get_main_queue(), {
         UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, "Item added to cart")
    })
}

但这里还有一个小问题,点击"Add to cart"按钮后,画外音会针对第一个可访问的项目,即后退按钮读取"back button",然后读取announcementNotification参数。

您对通知工作原理的理解是正确的,但是您对画外音如何处理基本交互的理解是错误的。当您 post 您的公告开始时,它立即被对 ui 交互的标准画外音响应打断,这是宣布所按内容的辅助功能标签。 Post 您的公告经过充分的延迟或基于除了点击之外的任何内容。

针对您的问题的第二部分(关注第一个可访问性问题)。这可能是因为发生了一些屏幕重新绘制,因此视图绘制层次结构 post 正在 post 固有的 UIAccessibilityScreenChangedNotification。您应该通过 post 自己使用您希望突出显示的元素来覆盖此通知。可能是启动屏幕更改的元素,也可能是由于此交互而添加的新内容。

基于 ChrisCM 的 ,实现了以下内容:

if UIAccessibility.isVoiceOverRunning {
    DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
        UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, "message")
    }
}