大多数浏览器和
Developer App 均支持流媒体播放。
-
在您的 iOS App 中支持全键盘控制
iPhone 和 iPad 支持适用于运动障碍者的许多输入模式,包括触摸交互修改、切换控制和全键盘控制。我们将探索人们如何仅通过键盘输入与其设备交互,通过真实示例发现关键 API。我们还将向您介绍一些在您在自己的 App 中集成全键盘控制时支持运动辅助功能的最佳实践。
资源
相关视频
WWDC22
WWDC21
-
下载
♪播放重低音音乐♪ ♪ 嗨 我是萨默潘妮居 今天很开心有这个机会 向大家介绍 iOS上的完整键盘功能 完整键盘功能是针对 行动不便的客户所设计的功能 一开始 我会先快速导览 iOS上常见的移动辅助功能 之后 会再进一步介绍 完整键盘功能 以及它为使用者带来的好处 特别是iPad的使用者 最后 我会切入开发人员 应谨记于心的 关键API及原则 在你开发应用程序的过程中 确保它们能够支持键盘用户 现在 先针对移动辅助功能进行介绍 当我们讨论到为iOS开发无障碍 应用程序时 我们希望考虑到所有的使用者 通常我们提到无障碍 指的只有旁白 这是项协助盲人或弱视使用者的技术 然而 很重要的是也需要确保 我们的软件能够让所有移动障碍 人士都能够使用 移动障碍的范围很广 个人在使用iOS装置时 在很多层面都会受到影响 有些人的移动范围有限 有些人的移动障碍较为细微 例如颤抖、或是有困难 触碰屏幕 不同程度的移动障碍需要不同的辅助 很多人觉得通过额外的硬设备 与他们的 装置互动是比较容易的 有时甚至是必要的 例如键盘、操纵杆 或是按钮 iOS提供了多样化的辅助技术 协助那些有移动障碍的使用者 能够顺畅地使用他们的装置 例如 我们提供了AssistiveTouch 给那些不方便 使用硬件设计或Multi-Touch手势的 使用者 AssistiveTouch通过屏幕按钮 将互动方式简化成单一点击 切换控制让那些移动障碍 较为严重的使用者 通过使用外接的切换器或按钮 让他们能够与iOS装置互动 当然 还有声控 让使用者仅仅通过声音 就能够与iOS装置互动 接下来就是要跟大家介绍 最新的移动技术 完整键盘功能 尽管iOS自iOS 9以来即能够 支持键盘的使用 它属于补充模式 而发布于iOS 13.4.1上的完整键盘 功能 能够让顾客百分百地经由键盘 与装置互动 它是取了AssistiveTouch 与切换控制的中间值 设计给那些没有足够灵敏度 触控屏幕 但不见得需要 或是不愿意使用 外接切换的使用者 它也提供了声控之外的另一选择 有些使用者可能无法说话 有语言障碍 或是身处于不方便使用 声控的环境 完整键盘功能对于那些 依赖订制键盘或是无障碍键盘 的使用者也很有帮助 例如单手键盘 或是这个分离式人体工学键盘 为了让完整键盘功能 在不使用屏幕触控之下 也能提供使用者 货真假实的iOS体验 在基本的键盘输入之外 还提供了很多其它选择 完整键盘功能也有巡览命令 所以使用者能够任意去到 屏幕上的任何一处 每一个互动命令 以及手势模块来执行拖拉的动作 所有的命令都是用制表键 做为修饰键 然而 它们也允许完整订制 喜欢不同键盘组合的用户 可能需要这个功能 那么 让我们来看看使用者如何 使用完整键盘功能浏览iPad 首先 我可以使用方向键 移到Notes App 然后用空格键启动 在这里 我可以用制表键 建立一个新笔记 接着我立刻就能编辑 我想为我的Shape Shuffle App 第二版做一些笔记 让它在iPad上发挥最大功能 当我结束编辑时 我能同时使用制表键加控制键 离开编辑模式 如果我想要删除一份旧笔记 我能使用制表键加Z键 带出一份作用选项单 然后我使用方向键加上空格键 把笔记删除 这时 如果我想再新增一份新笔记 我可以再用制表键移到建立笔记钮 或是我可以使用制表键加F键 来启动发现功能 接着我输入“新增” 便完成了 现在你认识了完整键盘功能 以及它的使用方式 接下来我们来看看身为开发人员 如何提供 键盘用户 最佳的使用体验 在2020年 我向大家介绍过切换控制 我们设计了一个提供给小孩的游戏 让他们学习形状、颜色、以及数字 我们合力让这个App易于访问 今年 我决定将Shape Shuffle改版 给iPad 让我们确保完整键盘功能 能在这个App发挥最大功能 假如你还没看过 Shape Shuffle也没关系 我快速带你认识一下 每一关 玩家会得到问题 像屏幕上显示的这样 两个黄色方块 然后他们必须点击下方的牌卡 找出三张所要求的牌卡 这个例子需要一张 上面有两个对象的卡 一个正方形的卡、以及一个黄色的卡 当他们在每一张正确的牌卡上 点击两次之后 就可以进到下一关 当关卡级数越高 问题就越困难 看起来我找到两个对象的卡了 所以我点击两次 将它加进我的白板 接着继续寻找黄色及正方形 现在我不确定这张卡是否正确 我可以在上面长按一下 在上面加上图钉 我就能够再回头查看它 我在下面左边这两张加上图钉 当我回头查看时 就能做出最后选择 然后过关 呃…过关了 现在让我们再回到游戏页面 我将看看再玩一次的状况如何 但这次我要使用键盘 当我按下制表键以及空格键时 似乎挺顺利的 我可以使用制表键移动到不同的卡片 然后用空格键翻开卡片 现在我要试试在三角形卡片上 加上图钉 我按下制表键加Z键带出作用选项单 但并没有看到任何作用供选择 现在 有两个方式可协助使用者 快速进到游戏的作用选项 例如加上图钉 第一个方式是通过订制作用选项 订制作用选项这个方式很不错 因为其它辅助技术也都能够使用 当你在某个地方加上订制作用选项 它会出现在旁白、切换控制 以及完整键盘功能 订制作用选项会出现在 你按下了制表键加Z键之后 如果你现在看到的 我需要做的只是针对我想新增的 作用选项 建立UIAccessibilityCustomAction 接着再将这些设定在 牌卡展现的 accessibilityCustomActions数组 而且 最好能够加上一个图示 尽管这些图示无法出现在 完整键盘功能 他们会出现在切换控制上 当加上订制作用选项后 我的UI画面会变成这样 当我按下制表键加Z键 会出现一个可爱的跳出窗口 让我能够为卡牌加上图钉 订制作用选项对于使用 辅助功能的用户来说很棒 然而 还有另一种也很棒的做法 你可以使用 你能新增一个订制键盘快捷键 订制键盘快捷键的好处在于 能适用于完整键盘功能的用户 也适用于使用基本键盘 与装置互动的用户 这些人不见得拥有完整键盘功能 对于辅助使用及权力使用者也适用 为了浏览键盘快捷键列表 仅需长按命令键 你便能够学习有关键盘快捷键的一切 想要学习更多与iPad相关的内容 请观赏 今年释出的“将你的iPad 带往下一层级”这支影片 今天我将为你简短示范 如何好好利用iOS及iPadOS 15上的 新API 先前仅出现于Mac Catalyst 13 通过覆盖你的AppDelegate上的 buildMenu 你便能够设定你的命令键 我在这里建立两个UI命令键 一个代表我的新增作用选项 另一个代表图钉作用选项 记得要加上显示名称 当我长按Command键时它会出现在 我的命令键抬头显示器上 接着 我建立一个新的UI菜单 我把它命名为“玩游戏” 然后将这些新命令传递成“儿童” 最后 将这个菜单加进我的 菜单建立器 就完成了 现在 我只需要这些项目在 抬头显示器上被启用 当我选定一张牌卡时 我也在GameViewController上覆盖了 canPerformAction 当我选定了某张牌卡时 这些项目才会出现 这就是我的游戏画面 但我长按住Command键 我便选定了一张牌卡 在这里 我想强调一个 开发完整键盘功能的关键原则 你应该要把订制作用选项 以及键盘快捷键加进你所有的公共动作 以优化使用者的效率 不仅它们容易被发现 而且还能够优化使用键盘 与App互动的使用者经验 让我们回到游戏 我新增了这个三角形 现在我使用换档键加上制表键 往主页按钮移动 然而 当我这么做的时候 我发现一个问题 这个三角形是可选择的 尽管我用了空格键点击它 没有起任何作用 所以首先 既然我们无法与它互动 为什么游标仍会走向它? 我已经在这个App上完成过一些 旁白支持功能 这就是它显现出来的样子 你会看到我将我项目的 isAccessibilityElement 设定成对的并且给它一个 accessibilityLabel 这个做法很棒 因为旁白需要 将每个项目都念出来 给使用者听 然而 当用户只有完整键盘功能时 光标也会跑到被标记着 isAccessibilityElement的项目 为了让完整键盘功能略过这个组件 我们需要增加一行 这里 你看到我们将 accessibilityResponds ToUserInteraction设定成错的 这告诉了系统 虽然这是一个辅助功能组件 但使用者无法与其互动 那么移动技术的光标 便会跳过它 例如完整键盘功能 以及切换控制 请注意 accessibilityRespondsToUserInteraction 只有在isAccessibilityElement是对的 情况下 才具有意义 系统的预设值会试着正确地将 isAccessibilityElement组件设定成对的 来进行互动 在大部分情况下 你只需要将 accessibilityResponds ToUserInteraction设成错的 适用在当你想让某个对象有 旁白辅助功能 但不需要完整键盘功能 或其它的移动技术 这带我们进入了当你在开发 完整键盘功能时 需要注意的第二个关键原则 当你在测试你App的时候 需要确认光标只能移到 能够与用户发生互动的项目 当你在开发你的App时 请把聚焦放在对的地方 将canBecomeFocused覆盖住 是相当诱人的 但正确的API做法是 刚刚我们讨论过的那样 然而 这会覆盖整个聚焦引擎的 聚焦行为 在没有开启完整键盘功能的状况下 会影响使用者使用制表键导航 所以当你只想针对 完整键盘功能的用户 进行功能调整时 请特别注意 避免发生这种状况 事实上 这里带出了一个重要项目 用来驱动完整键盘功能的聚焦系统 与用来驱动制表键导航的是同一个 在所有的OSs上都是如此 例如 iPadOS 当你在进行完整键盘功能时 很可能不会用到它 针对这个主题 如果你想了解更多 我建议这三支影片 今年我们有其它两支影片 “聚焦iPad键盘导览” 及“SwiftUI上的直接聚焦 与反射聚焦” 而在2017年 有一支很精采的影片 讨论聚焦引擎如何驱动tvOS 现在 让我们回到主页面 我想要确认我能够使用 完整键盘功能的发现功能 现在就来试试看 好的 在盒子里的关卡数字都很完美 寻找第八关及第12关很容易 因为我已经加上了一些旁白辅助功能 我也能够取得发现功能的设定钮 但如果我不知道 这个钮叫设定时该怎么办? 我可以输入“偏好”或“prefs” 呃 没有用 为了解决这个问题 我们可以 在accessibilityUserInputLabels上 设定数组与字符串 这里 我替这个标签的prefs 偏好、装备及设定都设好限定字 以确保无论他们输入 何种字符串 都能够找到 加上这些字符串符之后 你同时也帮了声控使用者一个忙 因为他们现在只要能够说出 任何一个字符串 就能找出设定钮 当然这不会干扰到你的旁白标 那么 现在当你输入“prefs”时 就能起作用了 现在要进入今天第三项 也是最后一项原则了 针对以影像为基础的控制时 请确保能够提供越多的标签越好 如此你的使用者便能够快速地 用发现功能找到想要的项目 现在 在结束之前 我想再增加一些有趣的功能 再看一次我的主页 因为这些项目都是UI钮 制表键很自然地就可以在上面移动 这很棒 但有注意到我的游标 总是一个长方形吗? 为了让画面更有趣 我们来让它呈现出与按钮一致的形状 为了让按钮附近的光标能够出现 可爱的形状 我们可以使用accessibilityPath 事实上 就是你使用在旁白的 同一个accessibilityPath 若是静态画面 你可将对应到 那个形状的accessibilityPath 设成UIBezierPath 请注意 我是在屏幕坐标系上 设定accessibilityPath 如果你在滚动视图上 你需要覆盖accessibilityPath 当你在滚动时 它也会处于 正确的屏幕坐标上 我们来看看加上这个效果之后的画面 现在 当我使用制表键移动时 我们会看到圆形 三角形、以及正方形 使用旁白时 也会有同样的效果 现在 让我们来复习一下 当你在为键盘开发App时 值得牢记于心的重要事项 特别是为了完整键盘功能的时候 首先 使用订制作用选项以及 键盘快捷键 以达到更好的效果 让你的App使用起来更有效率 接着 确认光标不会停在 无法与用户进行互动的项目上 最后 确认你增加了用户输入标签 特别是以影像为基础的控制 让使用者能够感受到 完整键盘功能的发现功能 这就是影片的重点 我希望在今天你能了解Apple 所有产品的移动辅助功能的重要性 尽管与装置互动的方式有很多种 键盘已成为我们的用户常用的工具 借着这支影片提供的信息 你现在应该能够有把握你的App 能够为完整键盘功能的用户 以及其它使用者 带来优异的使用体验 谢谢 并祝你有个 美好的WWDC 2021 ♪
-
-
7:06 - Accessibility custom actions
// Accessibility custom actions let addAction = UIAccessibilityCustomAction( name: gameLocString("add"), image: UIImage(systemName: "plus.square")) { _ in self.addCard() return true } let pinAction = UIAccessibilityCustomAction( name: gameLocString("pin"), image: UIImage(systemName: "pin.fill")) { _ in self.pinCard() return true } cardView.accessibilityCustomActions = [addAction, pinAction]
-
8:39 - Keyboard shortcuts: buildMenu
// Keyboard shortcuts // In AppDelegate.swift override func buildMenu(with builder: UIMenuBuilder) { super.buildMenu(with: builder) guard builder.system == .main else { return } let pinCommand = UIKeyCommand(title: gameLocString("pin"), image: UIImage(systemName: "pin.fill"), action:#selector(GameViewController.pinFocusedCard), input: "P", discoverabilityTitle:gameLocString("pin.card")) let addCommand = UIKeyCommand(title: gameLocString("add"), image: UIImage(systemName: "plus.square"), action: #selector(GameViewController.addFocusedCard), input: "A", discoverabilityTitle: gameLocString("add.card")) let identifier = UIMenu.Identifier("gameplay_menu") let menu = UIMenu.init(title: gameLocString("gameplay"), image: UIImage(systemName "rectangle.grid.3x2"), identifier: identifier, children: [addCommand, pinCommand]); builder.insertSibling(menu, afterMenu: .view) }
-
9:22 - Keyboard shortcuts: canPerformAction
// Keyboard shortcuts // In GameViewController.swift override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool { if action == #selector(addFocusedCard) || action == #selector(pinFocusedCard) { return self.focusedCard != .none } return super.canPerformAction(action, withSender: sender) }
-
10:35 - Accessibility elements
itemView.isAccessibilityElement = true itemView.accessibilityLabel = gameLocString(for: item)
-
11:01 - Responding to user interaction
itemView.accessibilityRespondsToUserInteraction = false
-
13:41 - Supporting accessible input
self.accessibilityUserInputLabels = [ gameLocString("settings"), gameLocString("prefs"), gameLocString("preferences"), gameLocString("gear")];
-
14:52 - Accessibility path
// Accessibility path let rect = circleLevelButton.convert(levelButton.bounds, to: nil) circleLevelButton.accessibilityPath = UIBezierPath(ovalIn: rect) // If your button is in a scroll view, it’s generally better to // override accessibilityPath and/or accessibilityFrame extension CircleButton { open override var accessibilityPath: UIBezierPath? { get { let rect = self.convert(self.bounds, to: nil) return UIBezierPath(ovalIn: rect) } set { // no-op } } }
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。