ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC=5] * * * * * >原文链接 :[Supporting Accessibility](https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/SupportingAccessibility.html#//apple_ref/doc/uid/TP40007457-CH12-SW1) 一个好用的应用程序是每个人都可以使用的应用程序,包括那些有残疾或身体障碍的应用程序,因为其功能和可用性作为有用的工具。 为了方便访问,iOS 应用程序必须向 VoiceOver 提供有关其用户界面元素的信息,以便视力受损的用户可以与这些元素进行交互。 UIKit 对象默认是可访问的,但仍然可以从视图控制器的角度来解决可访问性问题,其中包括: * 确保界面中的每个用户元素都是可访问的,包括控件和静态元素(如标签)。 * 确保可访问的元素提供准确和有用的信息。 通过以编程方式设置 VoiceOver 光标的位置,通过响应特定的 VoiceOver 手势以及观察辅助功能通知,您可以增强 VoiceOver 用户在应用中的体验。 ### 将VoiceOver光标移至特定元素 当您的应用在屏幕上呈现新视图时,请考虑设置 VoiceOver 光标的位置。当屏幕布局发生变化时,VoiceOver 对焦环(也称为 VoiceOver 光标)会将其位置按从左到右,从上到下重新排列在屏幕上显示的第一个元素上。将光标放在更合适的元素上可以加速用户的界面导航。例如,将新的视图控制器 push 到导航控制器的堆栈上时,VoiceOver 光标将落在导航栏的“后退”按钮上。您可能需要将该光标移至导航栏的标题或新 push 的页面上的元素。 要更改光标的位置,请使用 `UIAccessibilityPostNotification` 函数发布 `UIAccessibilityScreenChangedNotification` 通知。 通知会通知 VoiceOver 屏幕的内容已更改。 发布通知时,指定要分配焦点的元素,如清单6-1所示。 ###### 清单 6-1 发送改变光标的辅助通知 ~~~ @implementation MyViewController - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; // The second parameter is the new focus element. UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, self.myFirstElement); } @end ~~~ 布局更改(包括由旋转导致的布局更改)将重置VoiceOver光标的位置。 当您的视图控制器的布局更改时,发布通知 `UIAccessibilityLayoutChangedNotification` 。 与 `UIAccessibilityScreenChangedNotification` 通知一样,您可以指定要成为 VoiceOver 新的第一个元素的对象。 ### 响应特殊的 VoiceOve r手势 VoiceOver 定义了五种特殊手势来触发特定于应用程序的操作。 * **Escape**:双指Z形手势,用于解除模式对话框,或者返回导航层次结构中的一个级别。 * **Magic Tap**:双指双击执行最有意的动作。 * **Three-Finger Scroll**:三指滑动,可以垂直或水平滚动内容。 * **Increment**:单指向上滑动即可增加元素中的值。 * **Decrement**:用一根手指向下滑动即可减少元素中的值。 使用这些手势来执行视图和视图控制器的特定任务。 UIKit查找与手势相对应的实现方法。 它使用响应者链搜索方法,从拥有 VoiceOver 焦点的元素开始。 如果没有对象实现适当的方法,UIKit将为该手势执行默认的系统操作。 例如,如果没有从当前视图到 app delegate 找到双指双击手势的实现,那么双指双击手势就会播放并暂停音乐应用的音乐播放。 尽管你可以在你的处理程序中采取任何你想要的动作,但语音用户期望你的应用程序的行为遵循一定的指导方针。和任何手势一样,你的 VoiceOver 的实现应该遵循一种模式,以便与一个可访问的应用程序的交互仍然是直观的。 > 注意: > 所有特殊的 VoiceOver 手势方法都会返回一个布尔值,决定是否通过响应者链传播。 要停止传播,请返回 YES ; 否则,返回 NO 。 #### Escape ~~~ - (BOOL)accessibilityPerformEscape; ~~~ 使用 `accessibilityPerformEscape` 方法来处理转义手势。 对于叠加内容(如弹出式对话框或警告框)的视图,请使用该方法来消除叠加层。 Escape 手势的功能就像电脑键盘上 Esc 键的功能一样, 它会取消临时对话框或表单以显示主要内容。 您也可以使用 Escape 手势实现在自定义导航层次结构中返回上一个界面。 如果您已经使用 UINavigationController 对象,则不需要实现此手势,因为它已经处理此手势。 #### Magic Tap ~~~ - (BOOL)accessibilityPerformMagicTap; ~~~ 使用 `accessibilityPerformMagicTap` 方法来处理 Magic Tap 手势。 Magic Tap 手势快速执行常用或喜欢的操作。 例如,在“电话”应用程序中,“ Magic Tap”选取或挂断电话,在“时钟”应用程序中,“ Magic Tap”将启动并停止秒表。 您可以使用此手势来触发与 VoiceOver 光标所在元素不相关的操作。 要在应用程序中的任何位置处理 Magic Tap 手势,请在您的 app delegate 中实现 accessibilityPerformMagicTap 方法。 #### Three-Finger Scroll ~~~ - (BOOL)accessibilityScroll:(UIAccessibilityScrollDirection)direction; ~~~ 当 VoiceOver 用户执行三指滚动手势时,使用 `accessibilityScroll:`方法滚动自定义视图的内容。 显示书籍页面的自定义视图可以使用此手势来翻页。 传递给方法的参数指示了滚动的方向。 #### Increment and Decrement ~~~ - (void)accessibilityIncrement; - (void)accessibilityDecrement; ~~~ 使用 `accessibilityIncrement` 和 `accessibilityDecrement` 方法来增加或减少元素中的值。 具有 UIAccessibilityTraitAdjustable 特性的元素必须实现此方法。 ### 观察辅助功能通知 UIKit 发送辅助功能通知,通知您的应用程序相关的事件。 应用程序的对象可以观察任何相关的通知,并使用它们执行相应的任务。 例如,iBooks 应用程序使用 `UIAccessibilityAnnouncementDidFinishNotification` 通知打开页面,并在 VoiceOver 完成页面最后一行的讲话时进行翻页继续阅读。 这种操作提供了一个无缝的,不间断的阅读体验。 使用默认通知中心为辅助功能通知注册观察者。清单 6-2 显示了一个视图的例子,该视图记录一个公告的读取是成功还是被用户中断。 ###### 清单 6-2 注册辅助功能通知观察者 ~~~ @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 何时打开或关闭。 如果在您的应用程序被暂停时发生此通知,则当您的应用程序返回到前台时,您会收到通知。 有关辅助功能通知的列表,请参阅 [ UIAccessibility Protocol Reference](https://developer.apple.com/documentation/uikit/accessibility/uiaccessibility) 。