×

支持辅助行功能

96
RiverLi
2018.04.06 17:58 字数 1643

前言

为什么翻译这系列文章

概述

一个可访问的app是可以被每一个使用的,包含哪些残疾和身体有障碍的人士,同时保留其功能和可用性作为有用的工具。为了可以被访问,iOSApp必须使用户界面上的元素支持VoiceOver,以供视觉受损的用户可以与这些元素交互。UIKit对象默认是可访问的,但仍然可以从视图控制器的角度来解决可访问性的问题,包括:

  • 确保界面中的每个用户元素均可访问,包括控件和静态元素(如标签)。
  • 确保无障碍元素提供准确有用的信息。

你可以通过编程的方式设置VoiceOver对焦环的位置,通过响应特殊的VoiceOver手势以及观察辅助功能通知来增强VoiceOver用户在您的应用中的体验。

将VoiceOver光标移动到指定的元素

当你的App在屏幕上展示一个新的视图的时候,请考虑设置VoiceOver光标的位置。当屏幕的布局发生变化的时候,VoiceOver光标也会被重置,默认的重置方式是会聚焦在界面上从左到右,上到下的第一个元素上。将光标放在更合适的元素上可以加速用户对界面的导航。举例来说,当将新的视图控制器推入到导航控制器的堆栈上时,VoiceOver光标会落在导航栏的“后退”按钮上。你可能需要将光标移动到导航栏的标题或者新推入的页面的元素。

要改变光标的位置,可以使用UIAccessibilityPostNotification函数发出一个UIAccessibilityScreenChangedNotification通知。这个通知告诉VoiceOver界面上的内容发生了改变。当发送这个通知时,指定你想让光标位于的元素上,如下代码所示:

@implementation MyViewController
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
 
    UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification,
                                    self.myFirstElement);
}
@end

布局改变,包括屏幕旋转都会重置VoiceOver的位置。当你的ViewController的布局发生改变时,像发送UIAccessibilityScreenChangedNotification 一样发送 UIAccessibilityLayoutChangedNotification通知,你可以指定VoiceOver光标处于哪一个元素上。

响应特定的VoiceOver手势

VoiceOver定义了5种手势来触发app指定的操作。

  • Escape 双指Z形手势,用于消除模式对话框,或返回导航层次结构中的一个级别。
  • Magic Tap 双指双击,执行最有意的动作。
  • Three-Finger Scroll 三指滑动,可以垂直或水平滚动内容。
  • Increment 单指向上滑动即可增加元素中的值。
  • Decrement 单指向下滑动可减少元素中的值。

使用这些手势来执行特定于您的视图和视图控制器的任务。 UIKit查找实现与手势相对应的方法的方法。它使用响应者链搜索该方法,从拥有VoiceOver焦点的元素开始。如果没有对象实现对应的方法,UIKit将为该手势执行默认的系统操作。例如,如果在当前视图或者代理中找不到“Magic Tap”实现,则“Magic Tap”手势将播放并暂停音乐应用中的音乐播放。

尽管您可以在处理程序中采取任何想要的操作,但VoiceOver用户希望您的应用程序的操作符合特定的指导原则。与任何手势一样,VoiceOver手势的实施应遵循一种模式,以便与可访问应用的交互保持直觉。

所有特殊的VoiceOver手势方法都会返回一个布尔值,以确定是否通过响应者链传播。要停止传播,请返回YES;否则,退回NO。

Escape

使用accessibilityPerformEscape方法来处理Escape手势。对于覆盖内容的视图(例如模式对话框或弹框),请使用该方法关闭叠加层。 Escape手势的功能就像电脑键盘上Esc键的功能一样;它会取消临时对话框或工作表以显示主要内容。您也可以使用Escape手势导航自定义导航层次结构中的一个级别。如果您已经使用已经处理此手势的UINavigationController对象,则不需要实现此手势。

Magic Tap

使用accessibilityPerformMagicTap方法处理Magic Tap手势。 Magic Tap手势可以快速执行常用或最有意的操作。例如,在电话应用程序中,Magic Tap启动或挂断电话,在Clock应用程序中,Magic Tap启动并停止秒表。您可以使用此手势来触发与VoiceOver光标突出显示的元素不相关的操作。要从应用程序中的任何位置处理Magic Tap手势,请在app的代理中实现accessibilityPerformMagicTap方法。

Three-Finger Scroll

使用accessibilityScroll方法来滚动自定义视图中的内容,当VoiceOver用户使用Three-Finger Scroll手势的时候。显示书籍页面的自定义视图可能会使用该手势来实现翻页操作。传递给该方法的参数是滚动的方向。

Increment and Decrement

使用accessibilityIncrementaccessibilityDecrement方法来增加或者减少元素中的值。使用UIAccessibilityTraitAdjustable属性的元素必须实现这个方法。

监听辅助功能通知

UIKit发送辅助相关事件的通知给你的App。你App中的对象可以监听相关的通知并使用它们执行相关的任务。举例来说:iBookApp使用UIAccessibilityAnnouncementDidFinishNotification通知为了当VoiceOver完成读出页面最后一行内容时,翻页并继续阅读。此行为提供了无缝,不间断的阅读体验。

使用默认的通知中心来注册一个辅助监听。下面的代码展示了一个记录公告的阅读是成功了还是被用户打断了。

@implementation MyViewController
    
-(void)viewDidLoad {
    [super viewDidLoad];
    [NSNotificationCenter defaultCenter]
        addObserver:self
            selector:@selector(didFinishAnnouncement:)
                name:UIAccessibilityAnnouncementDidFinishNotification
                object: nil];
}

- (void)didFinishAnnouncement:(NSNotification *)dict {
    NSString *valueSpoken = [[dict userInfo]
                             objectForKey:UIAccessibilityAnnouncementKeyStringValue];
    NSString *wasSuccessful = [[dict userInfo] 
                               objectForKey:UIAccessibilityAnnouncementKeyWasSuccessful];
}
@end

另一个有用的通知是UIAccessibilityVoiceOverStatusChanged你可以使用这个通知来判断VoiceOver在什么时间打开或者关闭。如果这个通知在App挂起的状态发生,你可以在App进入前台的时候接受到这个通知。

其他你可以使用到的辅助类功能监听可以参考UIAccessibility

iOS开发
Web note ad 1