大多数浏览器和
Developer App 均支持流媒体播放。
-
App切换控制辅助功能
切换控制是一种功能强大的辅助功能技术,适用于行动不便的用户。 此功能为 iOS 原生功能,你可以使用提示、技巧和一些 API 为你的 app 创建更好的切换控制体验。 我们将向你介绍用户如何使用切换控制,并提供最佳方法,让你的 app 有效支持这一技术。要想充分利用本次会议,建议先熟悉常用的辅助功能原则和旁白辅助 API。获取更多信息,请查看“通过自定义操作让访问 App 更方便”,“编写出色的辅助功能标签”和“旁白:超越视觉效果的 App 测试”。
资源
相关视频
WWDC19
-
下载
(你好 WWDC 2020) 大家好 欢迎来到全球开发者大会 (APP切换控制辅助功能) (SOMMER PANAGE 工程经理) 我是 Sommer 我要谈的是 app 切换控制辅助功能 今天我很高兴 能够讨论一项非常重要的技术 这项技术能为运动功能障碍人士提供支持 那就是切换控制 我们经常谈到视力辅助方面的 API 在运动辅助方面却较少提及 对切换控制用户来说 我们或许需要采取更多措施 为这些用户真正赋予操作的便利 今天我们会涵盖什么是切换控制 哪些人使用这个功能 (什么是切换控制) 然后 我们讨论可使用的 API 以便为切换控制用户提供特定的支持 最后我们会谈及一些通用的最佳做法 以便更好地为运动功能障碍人士提供辅助
那么我们先开始了解切换控制吧
切换控制 是内置在 Apple 设备中的一项技术 它可以使运动能力有限的用户 与 iOS 设备进行互动 方法是操作一种或多种外部开关或按钮
用户通过这些开关在屏幕上控制光标 启动开关可以显示菜单 让用户通过轻点 手势、滚动、控制音量等 多种方式进行操作 使用开关系统的用户通常肢体行动不便 因此这些开关或按钮通常安装在轮椅上 用户通过头部轻点 舌部点击 用吸管吸气或吹气来操作开关 由于这些设备安装在轮椅上 它们通常处于充电状态 使屏幕保持开启 当然 了解切换控制的最佳方式 是观看我们的一位用户如何操作 我们将会看到 Ian Mckay 他在树林中移动 通过嘴控型开关来拍照
(Ian M.与切换控制)
我们注意到他可以用不同的嘴部动作 来移动屏幕上的光标 进行轻点操作等等 在刚在的视频中我们看到 Ian 通过嘴部动作进行多种切换 另一种很常见的情况是切换控制用户 会使用自动光标 自动光标 可以自动扫描项目 直到用户进行互动 我们可以具体观看一下这种自动扫描行为 (世界时钟) 我要用一个开关在世界时钟里添加新时钟 我要添加我最喜欢的城市之一 阿姆斯特丹 请注意看 光标在自动扫描 我什么也不用做 当我按下开关时 光标进入当前选中的选项组 如果光标悬停在下拉菜单选项时 切换控制可以显示菜单 这是我们用户使用切换控制 与设备互动的常见方式 在创建便于切换控制用户使用的 app 时 有一些事项需要我们额外考虑 在使用自动扫描时 用户通常需要等待光标 选中目标选项或选项组 因此按下开关的时机非常重要 一次错按会导致用户需要多进行几个步骤 来执行简单的操作 此外 导航项目的有效性和分组 对切换控制用户而言是关键 因为不当的分组 会导致用户需要经过长时间的等待 才能选中目标选项 最后 一些切换控制用户 可能会有颤抖或其它不自主运动 这将使错按发生的几率 高于其它辅助技术 如果有一个选项 可以删除所有数据或退出登录 那么一次意外的错按将会给切换选择用户 造成破坏性的后果 因此容错度非常重要 现在我们已经更好地了解 谁在使用切换选择功能 也了解了我们针对这一用户群体 需要考虑的重要事项 让我们来看看 如何创建便于这些用户的 app 但在讨论代码之前 我想强调一个要点 (切换控制支持几乎全部免费) (并附有良好的旁白辅助功能) 对于切换控制 你们通常不需要做任何额外的工作 创建一个可以 100% 使用旁白功能的 app 对切换控制而言已经相当不错 但有时候我们还需要稍微进行优化 来提升我们的切换控制体验 特别是我们可能需要一些特定行为 而这些行为不适用于旁白功能 另外 通过了解便于切换控制的 API 我们可以设计和创建 专门面向切换控制用户的 app 现在我们谈谈一些代码以及它们的作用 最近 我的很多朋友都有了小孩 这些孩子长大一些后 开始学习认识数字、形状和颜色 我一直是手作礼物的爱好者 所以我觉得 为他们创建一款 app 会很有趣 这是一款叫 Shape Shuffle 的游戏 在游戏中 孩子可以通过完成越来越多的挑战 在学习路径上通关 这些挑战要求他们给出 不同个数、形状和颜色的组合 让我们看一段视频了解它的操作 在主界面 我们可以在曲折的形状路径上 选择一个关卡 我要选第三关 (两个蓝色方形) 我们进入关卡后得到这样一个提示: 两个蓝色方形 我们可以点这些卡片来翻牌 选择三张卡片来完成提示 我找到了蓝色卡片 我可以轻点两次蓝色卡片提交答案 轻点两次 这样就好了 现在我继续翻牌 寻找数字 2 或者方形
还没找到
找到了 2 现在我可以轻点两次这张卡片 然后继续寻找方形 如果我不确定翻到的是不是方形 我可以长按卡片添加标签提示它的位置 以便帮助我记得返回查看 然后我继续寻找
现在我可以在几种形状上钉标签 直到我确定找到了方形
我觉得下面那张是正确答案 所以我双击 这就好了 我完成了我的第一个关卡 (两个蓝色方形) (成功) 这款游戏 对能够轻点屏幕的用户而言简单又有趣 但对我们的切换控制用户而言 却具有挑战性 (许多关卡没有清晰的分组) 首先主界面没有明确的元素分组 通常切换控制光标 会从上到下 从左到右扫描 而这款游戏的关卡线是曲折的 这会导致光标 不能按正确的顺序扫描关卡 另外 由于我们完全不对关卡进行分组 想寻找第 30 关的用户需要等待很长时间 才能等到光标到达目标关卡 (依赖轻点操作来查看卡片) 其次 我们需要轻点卡片来查看卡片内容 为了查看卡片 人工进行切换控制的用户 可能需要多次操作开关 这会非常费力 因为关卡越高 出现的卡片也越多 (使用手势进行互动) 最后 轻点两次和长按手势 需要频繁操作 对部分切换控制用户来说 这些手势可以实现 但他们需要进入手势子菜单 这将会更加拖延游戏进程 让我们看看怎么解决第一个问题 我们的关卡页面 有太多需要切换控制的元素 光标扫描这些元素时也毫无章法 解决办法分两步 首先 我们需要让切换控制 在单个关卡区内组合项目 方法是组合 accessibilityNavigationStyle 代码 幸好这很简单 因为我已经使用容器视图 为每三个关卡都建好了视图层级 接下来我们需要控制元素的顺序 不首选从上到下 从左到右的扫描顺序 做法是通过明确设置 AccessibilityElements 阵列 来回到我们需要的特定顺序 这样切换控制 会先前往第四关再扫描第五关 然后再扫描第六关
另一个问题是轻点翻牌 需要我们的切换控制用户多次进行互动 使用自动扫描的用户也许不介意 但进行人工扫描的用户 会发现翻牌导航很费力 (辅助功能 切换控制 自动翻牌) 我们为这些用户添加了额外的设置 使光标移到牌上时可以自动翻牌 为了执行这一步 当光标移到牌上时 accessibilityElementDidBecomeFocused 将会被调用 代码被调用后 我们就可以把牌的正面翻过来 当光标从牌上移开时 我们会调用 accessibilityElementDidLoseFocus 于是牌会翻回来 现在我们来看看具体的过程 注意看翻牌是怎样自动进行的 这里不需要进行菜单交互 在解决最后一个问题之前 即游戏需要多种手势操作的问题 我要快速介绍 自定义辅助功能操作的概念 (在 APP 中便捷访问行为) 自定义操作可以使 旁白和切换控制等辅助技术 可以便捷访问 app 中的常见行为 而这些行为很难通过光标导航来访问 例如在提醒事项中 删除和旗标等滑动操作 被列为自定义操作 (减少混乱) 把这些选项设为自定义操作 而不是用户需要进行光标导航的视图 这样我们可以大大减少混乱 (提升便捷度及响应速度) 同时可以大大提升常见行为的导航速度 因此操作起来也更方便 现在回到我们的 app 上 这款游戏需要频繁使用 轻点两次和长按手势 这使得切换控制用户 需要反复回到手势菜单 因此我们应该把这些手势变成操作 让用户可以轻松地 在顶级菜单进行这些操作 我们可以通过 accessibilityCustomActions API 实现 为了让每个操作 显示在切换控制的顶级菜单中 我们只需创建代码 UIAccessibilityCustomAction 我们为每个操作创建选项后 将这些选项作为序列分配到 AccessibilityCustomActions 上 当用户在该视图启动开关时 它们就会显示在切换控制的顶级菜单上 离开这一页之前我想再强调一点 我们在 iOS 14 中引入了新的 API 让大家可以为自定义操作设置图标 如大家所见 我用 SF Symbols 图标 来为我的标签操作设置图标 并将一个加号设为我的添加操作图标 如果你们不用图标 你们会看到我们原有的默认行为 菜单项会显示操作名称的首字母 (选择项目 下一项目) 现在我们看看这款游戏 在切换控制功能下的操作 为了显示自动翻牌 我关闭了自动扫描 这样你们会看到我使用两个开关
我使用右边的红色开关 使光标移到下一选项 左边的黄色开关用于进入一个选项组 或打开一个选项的菜单 由于我进行的是人工扫描 你们会发现我开启了自动翻牌行为 在搜索六个蓝色三角形时 我会在顶级菜单使用新的标签操作 在卡片的右上角钉上标签 在翻出更多牌后 我会找到蓝色卡片 然后用另一操作添加到答案中 在结束 API 的讨论之前 我要强调一些对切换控制 有用的方法和属性 首先… (检测切换控制正在运行) …如果切换控制运行时你们需要得到通知 你们可以调用 isSwitchControlRunning 或使用相关的通知 (区别旁白交互) 其次 有时候你们的用户界面是静态的 比如 UILabel 当用户轻点时会进行更新 这种情况下 我们要让切换控制知道 它需要导航到该选项 尽管它看起来像静态文本 我们可以将 accessibilityResponds ToUserInteraction 设为真值 以上就是 API 方面的内容 希望大家能学到有用的窍门 来打磨和优化自己的切换控制 app 也希望这些技巧能让大家对创建一款 完全适用于 切换控制用户的 app 有自己的构思 (最佳做法) 最后 我想跟大家 分享一些常见的最佳做法 帮助大家确保自己的 app 可以辅助 有运动功能障碍的用户 但是这些建议不仅仅适用于切换控制 它们能给所有用户带来更好的体验 首先… (确认破坏性行为) …你们需要在 app 中确认破坏性行为 或者后果严重的行为 这对切换控制用户来说尤为重要 因为他们错按选项的频率更高 用户如果意外删除了所有数据或账户 这绝对不好受 (不设时限) 其次 我们建议在 app 中不设时限 至少在控制切换运行时不设时限 输入配对码及认证码的页面 经常会出于安全考虑而设置很短的时限 切换控制用户由于需要等待光标移动 因此输入信息的速度较慢 输错信息时更改的时间也较长 因此时间限制让他们很无奈 第三… (对元素分组 提升扫描效率及速度) …确保你们的视图层级 便于在屏幕上对选项进行分组 清晰且便于操作的项目分组 对所有用户都有益 当切换控制运行时 这些分组变得更为重要 它们可以提升光标导航的效率和速度 (切忌在屏幕上长时间显示用户隐私) 最后 请谨记切换控制用户 可以使用安装在轮椅上的设备进行操作 这表示他们比较难以遮挡屏幕 因此我们要避免在屏幕上长时间地 显示账号或医疗信息 到这里 我们的演讲就告一段落了 (运动功能障碍用户使用的切换控制) 希望大家能更好地认识到 什么样的群体在使用切换控制 并在创建 app 时为这类用户群体 考虑一些关键的事项 我们仅仅添加几个代码 就可以对我们的游戏进行个性化设置 让它能够提供流畅简单的切换控制体验 最后 我们学习了一些最佳做法 这些做法在不同程度上 极大地影响着切换控制用户 我们希望这个分享能帮助大家 创建真正便于每个人使用的 app 感谢大家的参与 祝大家能够开心体验 2020 全球开发者大会
-
-
7:53 - Navigation Style and Element Ordering
containerView.accessibilityNavigationStyle = .combined containerView.accessibilityElements = [ levelFourView, levelFiveView, levelSixView]
-
8:47 - Follow Focus API
// Following Focus API class CardView : UIView { var orientation: CardOrientation enum CardOrientation { case front case back } override func accessibilityElementDidBecomeFocused() { self.flip(to: .front) } override func accessibilityElementDidLoseFocus() { self.flip(to: .back) } // The rest of the class… }
-
9:56 - Custom Actions API
// Custom Actions API (VoiceOver uses this too) func configureActions() { let pinAction = UIAccessibilityCustomAction( name: "Pin Card") { (_) -> Bool in self.setPinned(true) return true } pinAction.image = UIImage(systemName: "pin") let addAction = UIAccessibilityCustomAction( name: "Add Card") { (_) -> Bool in self.setSelected(true) return true } addAction.image = UIImage(systemName: "add.square") self.accessibilityCustomActions = [addAction, pinAction] }
-
11:51 - Other Useful API
static var isSwitchControlRunning: Bool { get } var accessibilityRespondsToUserInteraction: Bool { get set }
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。