iOS 13 引入了一种很棒的方式,可以为视障用户提供股票图表。通过自定义的辅助功能旋转控件,他们提供口头图表分析和音频图,通过音频渲染图表。这是描述图表最准确的方式,否则只能通过视觉方式获得。
如果你还没有亲自尝试过,请观看以下视频
不幸的是,苹果没有提供公共 API,使开发人员能够在他们的应用程序中实现它(目前还没有)。我认为图表可以提供一种很好的信息呈现方式,但我们不应将其使用限制于非残疾人士。
这就是 Audiograph 的用武之地
示例应用程序提供了许多与展示炫酷图表相关的东西。我在我的博客中写了关于图表的内容。但是,这个项目是关于可访问性的。
你可以在文件 ChartView+Accessibility.swift
中找到所有与可访问性相关的内容。
要运行示例项目,请克隆此 repo,并从 iOS Example 目录打开 iOS Example.xcworkspace。
在声明 import Audiograph
之后,你可以使用本地化的短语初始化 Audiograph。 这些短语将改善用户的体验。
它们描述了如何启动 Audiograph (accessibilityIndicationTitle
,例如“播放音频图”),以及什么短语应指示播放已结束 (completionIndicationUtterance
,例如“完成”)。
你需要存储对 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)
}()
现在你有多个选项来播放音频图。
.play(graphContent: )
,该参数的类型为 [CGPoint]
,并且应该是你用于绘制 UI 的相同点。仅当你知道何时播放音频图时,才鼓励使用第二个选项。 在任何其他情况下,第一个选项将最适合你。
为了利用系统,首先让你的图表视图符合 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
:呈现音频图的最简短方式。.recommended
:播放时长和最大长度之间的最佳折衷,以避免跳过数据点。.long
:最大持续时间。 根据你的输入,它可能会产生大量的样本,从而带来内存压力。.exactly
:指定播放应花费的确切时间量。 时间越长,需要存储在内存中的样本就越多:能力越大,责任越大。以上选项(.exactly
除外)仅作为**建议**。 最终的音频图可能需要更长的时间,具体取决于输入。 确保每个片段都有足够的时间播放,以便用户能够听到图表中两个点之间的差异。
但是,可能会删除一些数据点,以使播放时长保持在合理的范围内。
输入点会进行缩放,以使其介于最小和最大频率之间。 音频图的最低频率在 minFrequency
中指定,其最大频率存储在 maxFrequency
中。
这些频率可以根据用例进行更改。
可以通过设置 volumeCorrectionFactor
来配置音量。 该因子将应用于声音的最终音量。
在运行单元测试时,指定 0
可能会很方便。 如果用例需要更高的音量,则可以将该因子设置为最高 2
的值。
上面的视频以 Siri 的声音说“完成”结尾。 参数 completionIndicationUtterance
控制系统在播放音频图完成后说的短语。
即使可以将此短语设置为空字符串,也建议通知用户没有更多期望。 但是,必须由应用程序设置它,因为 Swift 包在开发时不能包含本地化文件。
当为图表播放音频图时,用户很可能对曲线的每个细节不感兴趣。 用户更想听到图表在什么时候朝哪个方向移动。
为了实现这一点,该库可以在生成音频图之前平滑图表。
考虑以下输入图
_ /
/ \_/
_ _ _ _/
- / \_/ \_/ \ /
/ \_/ \_/
_/
/
应用平滑处理后,听起来会更像这样
/
_/
/
____________ /
_/ \_/
/
/
/
默认情况下,平滑处理设置为适合大多数需求的参数。 但是,你可以完全关闭它(通过将其设置为 .none
)或对其进行微调,以提供特定用例的最佳用户体验。
为此,它使用指数移动平均值,自定义值应介于 [0, 1]
之间,其中 1
表示使用原始数据,0
表示最大平滑度。
使用 Swift Package Manager 将此添加到你的项目中。 在 Xcode 中,这很简单:文件 > Swift Packages > 添加 Package Dependency... 就完成了。 以下显示了旧项目的其他安装选项。
如果你已经在使用 CocoaPods,只需将 'Audiograph' 添加到你的 Podfile
,然后运行 pod install
。
如果你已经在使用 Carthage,只需添加到你的 Cartfile
github "Tantalum73/Audiograph" ~> 1.0
然后运行 carthage update
以构建框架,并将构建的 Audiograph
.framework 拖到你的 Xcode 项目中。
Andreas Neusüß
我很想听取你的反馈。 你可以给我发送电子邮件或在 Twitter 上联系我! 😊
Audiograph 在 MIT 许可证下可用。 有关更多信息,请参阅 LICENSE 文件。