【CSDN 编者按】语言控制向很多无法充分挖掘 iPhone 潜力的人敞开了 iOS 的大门。
(相关资料图)
原文链接:https://www.swiftjectivec.com/voice-control-accessibility-tweaks-ios/
作者 | Jordan Morgan 译者 | 弯月
出品 | CSDN(ID:CSDNnews)
语音控制是 iOS 设备上提供的一项突破性辅助技术,由 Cupertino & Friends 开发。这项技术在 iOS 13 中首次亮相,有了这项技术,你就可以通过语音控制 iPhone 了。
你可以试试看,拿起手机,然后说:" 嘿 Siri,打开语音控制。"
在语音控制被激活后,你就可以通过各种命令导航和使用 iOS 了,命令的形式为 " 一个动词 + 一个名词 "。例如," 打开手电筒 " 或 " 播放音乐 "。如果你不确定自己能干什么,甚至可以说 " 显示命令 " 或 " 告诉我该说什么 ",这样就能获得一些提示。
语音控制主要有三种显示模式。如果某个功能支持辅助引擎,则可以看到:
项目名称:对应于该功能的 accessibilityLabel 值。
编号:每个选项的编号。
网格:这些线将界面分割成一个个网格,这样你就可以专注研究一个区域。
开发人员可能没有意识到的一件事是,语音控制除了可以帮助残障人士打开 iPhone 之外,对于 iOS 工程师来说,这其实是一个代码作弊神器。为什么?因为你可以看到界面内所有 accessibilityLabel(可访问性标签)的值!
你可以很轻松地看到自己漏掉了什么。如果你不熟悉 iOS 上的辅助功能编程,可能觉得这些可访问性标签也没什么大不了,其实你应该了解一下这些属性。
选项名称是默认模式,因此你能够快速盘点所有的选项。这些天来,这一直是我测试我们的产品 Voice Over 的最佳方式。如果你发现某个可访问性标签不太适合语音控制,则可以通过 API 来修改:
// In UIKitopen var accessibilityUserInputLabels: [ String ] !// In SwiftUI.accessibilityInputLabels ( [ Text ] )
这个字符串数组可以帮助语音控制功能做出响应。最重要的是,数组中的第一个字符串将取代界面显示的可访问性标签值。
回忆一下,设置的图标一般是一个小齿轮。假设你有一个视频编辑应用,如下所示:
struct SettingsButton: View { var body: some View { Button { openAudioSettings ( ) } label: { Image ( systemName: "gear.circle" ) } .accessibilityLabel ( "Audio Levels and Mixing Settings" ) }}
为了指示 Siri 正确打开这个应用,我们需要说:"Open audio levels and mixing settings",其中 "Open" 是动词,意思是打开,而 "audio levels and mixing settings" 就是上述代码中设置的可访问性标签的值。这个指令显然太啰嗦了,我们可以利用 accessibilityInputLabels 完成以下两件事:
1. 缩短指令。
2. 指定语音控制的响应内容。
如下所示:
struct SettingsButton: View { private let axVoiceControlCommands: [ Text ] = [ Text ( "Audio Settings" ) , Text ( "Settings" ) , Text ( "Audio Levels" ) , Text ( "Mixing Settings" ) ] var body: some View { Button { openAudioSettings ( ) } label: { Image ( systemName: "gear.circle" ) } .accessibilityLabel ( "Audio Levels and Mixing Settings" ) .accessibilityInputLabels ( axVoiceControlCommands ) }}
如此一来,我们就可以使用 accessibilityInputLabels 中指定的任何一个词语作为指令:"Open Audio Settings"、"Open Settings"、"Open Audio Levels" 或者 "Open Mixing Settings"。
最近,我一直在改进我们的语音控制体验。虽然,现在我们的语音控制体验可以正常运行了,但在这个过程中,我遇到了很多挫折。
相似的项目名称
我发现,有几个地方出现了相同的可访问性标签值。如下图所示,"Create a post for this time" 反复显示:
于是,我就在想这是不是一个问题。结果发现,照片应用也有同样的 " 问题 ",因此我想知道他们是如何处理的。最终发现,原来是语音控制解决了这个问题。当你发出的指令涉及多个显示标签时,比如下图中 "Tap Live Photo",iOS 就会在每张照片上显示一个数字编号,这样就可以消除歧义了:
很聪明的做法。冗长的名称
有时候,我不知道用什么样的字符串与界面交互。例如,在我们的设计中,网格中的每一项可以代表任何操作。你可以将它们视为社交媒体帖子。在这种情况下,似乎直接念出文本并不太方便,尤其是如果文本是 URL 的话,未免也太冗长了。
最后,我决定使用编号。这种方法不仅可以让每一项都成为独一无二的存在,而且打开操作也非常容易。
在下图中,右边是默认的显示,左边是我最后采用的编号方式:
没有用于检测语音控制的 API最后,我遇到了一个最棘手的问题。我们无法通过 API 检测何时语音控制处于使用状态。所以,我们不能编写下面这样的代码:
func tableView ( _ tableView: UITableView, didSelectRowAt indexPath: IndexPath ) { if indexPath.row == TheOneWithTheSwitchInIt { if UIAccessibility.isVoiceOverRunning { // Perform some action that toggling // The UISwich would normally do } } }
为什么我们要写这样的代码?因为某些网格内的单元格有 UISwitch 控件。这是一个标准的用户体验,在 iOS 中随处可见。我们写这段代码的原因是,有可能人们不会点击格子与它们互动,而是直接使用开关控件。
但对于 Voice Over,这种行为正是我们需要的。问题在于,语音控制不适合这样的设置。请注意如下单元格 "Pause Queue Off":
如果用户说 "Tap Pause Queue Off",上面的逻辑就会触发,但是检查 Voice Over 却得不到任何响应。重要的是,Voice Over 和 Voice Control 是相互排斥的,你只能使用其中之一。我多么希望苹果有一个简单的 API 来检查语音控制的状态,就像下面这样:
UIAccessibility.isVoiceControlRunning
然而,很遗憾,我们没有。因此,解决这样的问题就会非常困难。
语音控制非常酷,它是苹果推出的一项我个人非常喜欢的技术。但是,相关的开发还是有一些陷阱,例如你无法通过 API 检测语音控制是否正在运行,这仍然让我感到困惑。
然而,这是测试个人语音控制实现的最佳方式之一。最重要的是,它向很多无法充分挖掘 iPhone 潜力的人敞开了 iOS 的大门。
标签:
3月16日,盛和资源(600392)副总经理毛韶春、黄厚兵,财务总监夏兰田,董秘郭晓雷,通过上交所集中竞价交...
2022年3月15日,这是继1983年以来的第40个国际消费者权益日。中消协组织围绕共促消费公平消费维权年主题...
首批金控牌照的归属出炉,两家公司拿到许可证。3月17日,央行发布公告称,已批准中国中信金融控股有限公...
时隔半月之久,西宁市城北区逐步推动复工复产,往日的生机活力被渐渐寻回,牛肉面红油飘香、包子铺炊烟...
音乐是我生活的一部分,是我的梦想,也是我的事业。英国音乐人亚当(Adam)告诉记者,在中国的十几年里,...
Copyright © 2015-2022 起点舞蹈网版权所有 备案号:皖ICP备2022009963号-12 联系邮箱: 39 60 29 14 2@qq.com