背景
iOS 13 引入了一个向视障用户提供股票图表的绝佳方式。使用自定义的可访问性旋转器,他们提供语音图表分析和通过音频渲染图表的 audiograph。这是描述图表最准确的方法,否则这些图表只能以视觉形式呈现。
如果您还没有亲自尝试,请查看以下视频
Audiograph
不幸的是,苹果还没有公开 API,让开发者能够在他们的应用中实现它(目前还没有)。我认为图表可以提供一种展示信息的好方式,但我们的使用不应仅限于那些没有残疾的人。
这就是 Audiograph 发挥作用的地方
示例
示例应用提供了许多与展示酷炫图表相关的内容。我在我的 博客 中讨论了这个图表。然而,这个项目是关于可访问性的。
您可以在文件 ChartView+Accessibility.swift
中找到所有与可访问性相关的内容。
要运行示例项目,请克隆此仓库,并从 iOS Example 目录中打开 iOS Example.xcworkspace。
使用方法
在声明 import Audiograph
之后,您可以使用本地化短语初始化 Audiograph。这些短语将改善您用户的使用体验。
它们描述了如何启动 Audiograph (例如,accessibilityIndicationTitle
, 例如 "Play Audiograph") 以及应该用哪个短语表示播放结束 (例如,completionIndicationUtterance
, 例如 "Complete")。
您需要存储对 Audiograph
的强引用。
let audiograph: Audiograph = {
let completion = NSLocalizedString("CHART_ACCESSIBILITY_AUDIOGRAPH_COMPLETION_PHRASE", comment: "This phrase is read when the Audiograph has completed describing the chart using audio. Should be something like 'complete'.")
let indication = NSLocalizedString("CHART_PLAY_AUDIOGRAPH_ACTION", comment: "The title of the accessibility action that starts playing the audiograph. 'Play audiograph.' for example.")
let localizations = AudiographLocalizations(completionIndicationUtterance: completion, accessibilityIndicationTitle: indication)
return Audiograph(localizations: localizations)
}()
现在您有多种播放 Audiograph 的选项。
- 使用自定义无障碍操作
- 直接调用
.play(graphContent: )
,参数类型为[CGPoint]
,应该是您用来绘制 UI 的相同点。
第二个选项仅在您确切知道何时播放 Audiograph 时建议使用。在其他情况下,第一个选项将最适合您。
为了利用系统,开始使您的图表视图遵循 AudiographProvidable
。
这样操作时,视图可以通过将 graphContent
设置为绘制 UI 也用到的 [CGPoint]
来提供数据点。
在配置无障碍属性时,确保使用 audiograph.createCustomAccessibilityAction(for: )
作为自定义操作
extension ChartView: AudiographProvidable {
var graphContent: [CGPoint] {
scaledPoints
}
var accessibilityLabelText: String { "Chart, price over time" }
var accessibilityHintText: String { "Actions for playing Audiograph available." }
func setupAccessibility() {
isAccessibilityElement = true
shouldGroupAccessibilityChildren = true
accessibilityLabel = accessibilityLabelText
accessibilityHint = accessibilityHintText
accessibilityCustomActions = [audiograph.createCustomAccessibilityAction(for: self)]
}
}
按照这种方式操作时,Audiograph 和返回的操作将负责开始和停止播放。
您可以在“ChatzChartView+Accessibility.swift”文件中找到如何配置它的示例
配置
所有提到的自定义设置都需要在调用 play(graphContent:completion:)
开始播放之前设置。
播放时长
指定音频应该播放的秒数。可能选项包括:
public enum PlayingDuration {
case short
case recommended
case long
case exactly(DispatchTimeInterval)
}
.short
: 以最简方式呈现 Audiograph。.recommended
: 在播放时长和最大长度之间取得最佳平衡,避免跳过数据点。.long
: 最大时长。根据您的输入,可能会产生大量样本,从而引入内存压力。.exactly
: 指定播放应该持续的确切时间。所需时间越长,存储在内存中的样本就越多:权力越大,责任越大。
上述选项(除.exactly
外)仅作为建议。最终的Audiograph可能会因为输入而耗时更长。确保每个段落有足够的时间播放,以便用户能够听到图表两点之间的差异。
但是,可能会删除一些数据点,以便将播放时长控制在合理范围内。
频率
输入点被缩放,以便它们位于最小和最大频率之间。Audiograph的最低频率在minFrequency
中指定,最高频率存储在maxFrequency
中。
这些频率可以根据使用情况进行调整。
音量
音量可以通过设置volumeCorrectionFactor
进行配置。该系数应用于最终音量。
在运行单元测试时,指定0
可能更方便。如果使用情况需要更高的音量,该系数可以设置为2
。
完成短语
上面的视频以Siri语音说“完成”结束。参数completionIndicationUtterance
控制系统在播放Audiograph完成后说的话。
尽管可以将该短语设置为空字符串,但建议通知用户不会再有任何东西可期待。然而,必须由应用程序设置,因为Swift-Package在开发时不能包含本地化文件。
平滑处理
当为图表播放Audiograph时,用户最可能不关心曲线的每一处细节。用户更希望听到图表何时移动到哪个方向。
为了实现这一点,库可以在生成Audiograph之前对图表进行平滑处理。
考虑以下输入图表
_ /
/ \_/
_ _ _ _/
- / \_/ \_/ \ /
/ \_/ \_/
_/
/
应用平滑处理后,听起来会更像这样
/
_/
/
____________ /
_/ \_/
/
/
/
默认情况下,平滑度被设置为适用于大多数需求的参数。但是,您可以完全关闭它(将其设置为 .none
),或者根据您的特定使用场景进行微调,以提供最佳的用户体验。
为此,它使用指数移动平均和自定义值应在 [0, 1]
的范围内,其中 1
表示使用原始数据,而 0
表示最大平滑度。
安装
Swift 包管理器
使用 Swift 包管理器将此添加到您的项目中。在 Xcode 中,这样操作:文件 > Swift 包 > 添加包依赖... 完成后,您就完成了。以下是针对旧项目的其他安装选项。
CocoaPods
如果您已经使用 CocoaPods,只需在您的 Podfile
中添加 'Audiograph' 然后运行 pod install
。
Carthage
如果您已经使用 Carthage,只需将其添加到您的 Cartfile
。
github "Tantalum73/Audiograph" ~> 0.5
然后运行 carthage update
来构建框架,然后将构建的 Audiograph.framework
拖到您的 Xcode 项目中。
作者
Andreas Neusüß
我很乐意听取您的反馈。您可以通过电子邮件或通过 Twitter 与我联系!
许可证
Audiograph可在MIT许可证下使用。有关更多信息,请参阅LICENSE文件。