首页 文章

VoiceOver和OpenGL中的滚动支持UIViews

提问于
浏览
1

我正在寻找有关如何将使用OpenGL绘制的可滚动列表制作成可通过VoiceOver访问的CAEAGLLayer支持的UIViews的建议 . 理想情况下,OpenGL中的可滚动列表应该像本机UIScrollView一样:

  • 当用户用三根手指向左/向右滑动时,我想向上/向下滚动页面 . 通过实现accessibilityScroll:方法可以轻松实现此行为 .

  • 当用户用一根手指向左/向右滑动以浏览列表中的所有项目并且辅助功能焦点移动到列表的最后/第一部分可见项目时,我希望列表稍微滚动以确保新聚焦的项目是完全可见 .

  • 当用户直接点击列表的最后/第一个部分可见项目以将可访问性焦点直接移动到它时,我不希望发生滚动操作 .

  • 当用户继续用一根手指向左/向右滑动,同时选择列表的最后/第一部分可见项目时,我希望列表向上/向下滚动一页以显示以前隐藏的项目 .

正如我上面所说,我知道如何实现第1项,但经过广泛研究Apple's documentation后,我仍然不知道如何使用iOS辅助功能API使#2到#4项工作 . 不过,我确实认为这些项目对于良好的可访问性体验非常重要 .

任何意见是极大的赞赏 . 谢谢!

1 回答

  • 0

    UIAccessibility 是一种非正式协议,用于检查VoiceOver等辅助功能客户端解释和导航用户界面所需的数据 . UIKit类实现了该协议中的全套方法,默认情况下可以访问大多数视图 . 但是,不直接由 UIView 支持的界面元素(例如包含 CAEAGLLayer 的视图)必须手动实现所有相关的辅助功能方法 .

    呈现此内容的最佳且通常唯一的方法是实现与场景内容相对应的UIAccessibilityElement对象的阴影层次结构 . 为此,必须将UIKit视图层次结构中的 UIView 声明为UIAccessibilityContainer . 这是一个两步过程 . 首先,您必须确保支持容器的视图本身不是可访问性元素,可以通过设置或覆盖 isAccessibilityElement 来返回 false . 其次,您必须实现非正式 UIAccessibilityContainer 协议中定义的四种方法,以访问子可访问性元素:

    • func accessibilityElementCount()

    • func index(ofAccessibilityElement element: Any)

    • func index(ofAccessibilityElement: Any)

    • var accessibilityElements: [Any]?

    在大多数情况下,您需要维护一个 UIAccessibilityElement 对象数组,每个对象代表自定义呈现的用户界面的一个组件 . 此数组可用于将后备视图的 Contract 作为 UIAccessibilityContainer 来实现 . 然后,您可以使用 UIAccessibility 协议中的方法扩展元素,使其像滚动视图,按钮和其他控件一样运行 .

    要完成#1,您需要在辅助功能层次结构中的元素上实现 accessibiilityScroll() 以响应滚动操作,返回 true 并使用描述新滚动位置的字符串参数发布 UIAccessibilityPageScrolledNotification . 听起来你有这个部分没有问题 .

    要求#2,#3和#4都需要在元素获得焦点时以编程方式滚动视图(或者,在#3的情况下,选择不执行任何操作) . 这可以使用UIAccessibilityFocus非正式协议来完成 . 特别是,每个元素都可以响应 func accessibilityElementDidBecomeFocused() 并将其焦点状态传递回负责滚动视图的对象 . 如果这会触发分页滚动,请不要忘记发布上面讨论过的页面滚动通知 .

相关问题