使用嵌入式视图控制器设置view.accessibilityElements

时间:2016-05-31 15:23:35

标签: ios objective-c uiaccessibility

我正在尝试将iOS辅助功能支持/配音添加到我的应用中。我的主屏幕有三个主要控件,但第三个控件托管在嵌入式视图控制器中。

我在prepareForSegue中设置了辅助功能元素,并确认嵌入的视图控制器控件都已加载。问题是我仍然只能选择封闭视图控制器中的前两个控件。

self.view.accessibilityElements = 
    @[ 
        self.cmdMenu,                      // works
        self.collectionView,               // works
        self.childViewController.peerMenu  // doesn't work
    ];

所有三个视图都是isAccessibilityElement = YES。

我错过了什么吗?我无法想象在同一视图控制器中存在对可访问性元素的限制。

1 个答案:

答案 0 :(得分:9)

我发现了我的错误,现在有Voice Over工作了。在这个过程中,我想出了一些我想分享的内容。

  1. 在我原来的问题中,您可以从主视图控制器中引用子视图控制器中的控件。您可以直接添加控件(就像我在我的问题中所做的那样),也可以使用self.view.accessibilityElements = @[ _control1, childViewController.view, childViewController2.view]在子视图控制器中添加所有辅助功能元素。
  2. 如果在(1.)中添加子视图控制器中的所有控件,请确保childViewController.view.isAccessibilityElement = NO
  3. 您可以向accessibilityElements添加任何类型的对象,甚至是没有辅助功能信息的元素。 API不会断言或警告您。这最终成了我的错误。
  4. 如果您的用户界面发生了变化,您需要更改accessibilityElements数组中项目的数量或顺序,请使用UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, self)告诉UIKit。通知参数(我发送self的地方)告诉Voice Over在通知完成时应该将光标放在哪里。
  5. 如果你想大声朗读一些短暂通知的文字(想象当Clash Of Clans告诉你在那个Tree Stump中发现了多少个Gems),请致电UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, messageText)。有一点需要注意,除非没有其他Voice Over正在进行,否则不会大声朗读messageText。你需要自己管理时间。提交了一个bug。 Apple可以让它变得更好。
  6. 如果您使用UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, messageText),则可以收听UIAccessibilityAnnouncementDidFinishNotification,但不幸的是,此通知几乎没有任何价值。只有完全使用了messageText,才会收到通知。它并没有告诉你它被说出来了,但是被打断了,并且它也不会被触发通过UIKit框架发出的任何文字。
  7. iOS模拟器中的辅助功能检查器很糟糕。如果您的辅助功能设置正确,它可以告诉您有什么。如果您遇到问题,Inspector不会向您提供有关错误的任何信息。整个UIAccessibility API都是如此。它很容易使用,几乎总是有效。但是当它不起作用时,你需要求助于狩猎和啄食来解决它。 API需要一些类似于Apple处理Constraint警告的断言或控制台消息。 Spoiler警告:Xcode 8中的辅助功能检查器更好,但仍然无法解决我的问题。
  8. UIAccessibility.h标题中有大量有用的信息。如果您正在着手UIAccessibility支持,那么这是一个很好的阅读。