Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Accessibility for Swift Charts

mika
August 23, 2024
330

Accessibility for Swift Charts

mika

August 23, 2024
Tweet

Transcript

  1. Swift Charts とは • Marks ◦ 折れ線グラフ ◦ 散布図 ◦

    棒グラフ ◦ 円グラフ (iOS 17.0+) ◦ ヒートマップ ◦ … • Vectorized plots (iOS 18.0+) 4 https://developer.apple.com/documentation/charts, https://developer.apple.com/jp/videos/play/wwdc2024/10155/
  2. チャートのオーディオグラフ • グラフのデータを⾳声に変換する • x 軸を時間、y 軸をピッチとして表す ◦ ⼤きな値は⾼い⾳ ◦

    ⼩さな値は低い⾳ • 連続的なデータは連続した⾳ • 離散的なデータは離散的な⾳ 12
  3. オーディオグラフの他の機能 チャートを説明 📢 • 「x 軸は ~ です。」 • 「y

    軸は ~ です。」 • 「~ 個のデータ系列があります。」 19
  4. VoiceOver / Audio Graphs の起動⽅法 1. VoiceOver を起動する ◦ 💡

    簡単に起動できるようにしておくと便利 ◦ 💡 私は電源ボタン3回クリックにアクセシビリティのショートカットを割り当てています 2. ローターの中から「オーディオグラフ」のメニューを探す ◦ ⼆本指で捻る動き、ちょっと難しい 3. 下にスワイプでメニューを切り替える ◦ オーディオグラフを再⽣ ◦ チャートの詳細 ◦ チャートを説明 4. ダブルタップで選択 20 https://support.apple.com/ja-jp/111796
  5. 開発中の動作確認⽅法 Swift Charts の VoiceOver を確認する⽅法 • Accessibility Inspector を使⽤する

    ◦ Xcode の Open Developer Tool から ◦ 💡実機と挙動が違うことがあるので、最終的には実機で検証する必要がある • 実機で検証する Swift Charts の Audio Graphs を確認する⽅法 • 実機で検証する 23
  6. 【準備】Swift Charts でグラフを作成 struct Climate: Identifiable { var id: UUID

    = .init() var month: Int var precipitation: Double } var body: some View { Chart { ForEach(data, id: \.id) { item in BarMark( x: .value("Month", item.month), y: .value("Precipitation", item.precipitation) ) } } .chartXAxisLabel("月") .chartYAxisLabel("降水量") ... } 24 https://www.data.jma.go.jp/stats/etrn/view/nml_sfc_ym.php?prec_no=44&block_no=47662&year=2023&month=&day=&view=
  7. まずは現状を把握する 25 アクセシビリティ対応していなくても、VoiceOver, Audio Graphs 共に利⽤できる → Swift Charts は

    VoiceOver, Audio Graphs を⾃動サポートしている! しかしながら、最低限の読み上げがサポートされているだけで細かい問題点はあ るので、アクセシビリティ対応していく!
  8. Accessibility Inspector で確認してみると...🤔 【VoiceOver】グラフの値の読み上げの問題 28 • 単位がないので何の値なのかわかりにくい • 降⽔量は Double

    なのに⼩数点以下が読み上げられ ていない • x 軸の値(Label)が「7 to (から) 8」などと読まれ てしまう
  9. アクセシビリティラベルを付与して解決 var body: some View { Chart { ForEach(data, id:

    \.id) { item in BarMark( x: .value("Month", item.month), y: .value("Precipitation", item.precipitation) ) .accessibilityLabel("\(item.month) 月") .accessibilityValue("\(String(format: "%.1f", item.precipitation)) ミリメートル") } } .chartXAxisLabel("月") .chartYAxisLabel("降水量") ... } 29 • 単位を追加 • ⼩数点第⼀位まで読み上げ られるように ✅
  10. var body: some View { Chart { ForEach(data, id: \.id)

    { item in BarMark( x: .value("Month", item.month), y: .value("Precipitation", item.precipitation) ) .accessibilityLabel("\(item.month) 月") .accessibilityValue("\(String(format: "%.1f", item.precipitation)) ミリメートル") } } .chartXAxisLabel("月") .chartYAxisLabel("降水量") ... } value に指定するラベルが読まれてしまっている 35
  11. var body: some View { Chart { ForEach(data, id: \.id)

    { item in BarMark( x: .value("月", item.month), y: .value("降水量", item.precipitation) ) .accessibilityLabel("\(item.month) 月") .accessibilityValue("\(String(format: "%.1f", item.precipitation)) ミリメートル") } } .chartXAxisLabel("月") .chartYAxisLabel("降水量") ... } value に指定するラベルを修正して解決 36 ここも読まれるので、⽇本語に変更 ✅
  12. 多⾔語対応するのなら ラベルは LocalizedStringKey なので、String Catalog に訳語を追加して利⽤する こともできる 37 let accessibilityValueUnit:

    LocalizedStringResource = "millimeter" let xAxisTitle: LocalizedStringResource = "Month" let yAxisTitle: LocalizedStringResource = "Precipitation" // 使う時はこんな感じ BarMark( x: .value(String(localized: xAxisTitle), item.month), y: .value(String(localized: yAxisTitle), item.precipitation) ) ✅
  13. AXChartDescripter を活⽤する 41 public struct ChartDescriptor: AXChartDescriptorRepresentable { public func

    makeChartDescriptor() -> AXChartDescriptor { ... return AXChartDescriptor( title: "東京都の月間降水量", summary: "東京都の降水量の平年値を月ごとに示しています。 ", xAxis: xAxis, yAxis: yAxis, series: series ) } } var body: some View { Chart { ... } .accessibilityChartDescriptor( ChartDescriptor(...) ) } ✅
  14. チャートのアクセシビリティ対応する時に意識すること • どんなデータなのか、どう伝えたいかを意識する • 明確に、かつ包含的に ◦ ⽇付や単位を補完する • 主観的な⽤語の使⽤は避ける ◦

    「急速に」「徐々に」「ほとんど」などは使⽤しない • 曖昧になりやすい形式や略語を避ける ◦ 6/6 ではなく6⽉6⽇、6m ではなく 6 メートル など ◦ スラッシュは「スラッシュ」と読まれてしまうので最終的には実機で検証することが⼤事 43
  15. Next steps • Apple 標準アプリのチャートで VoiceOver / Audio Graphs を試してみる

    • もし⾃⾝のプロダクトにチャートがあるなら、 VoiceOver / Audio Graphs を試して現状を把握する • 今⽇学んだことを踏まえて、アクセシビリティ対応をしよ う!! 47
  16. References • https://developer.apple.com/documentation/charts • https://developer.apple.com/documentation/Accessibility/audio-graphs • https://developer.apple.com/jp/videos/play/wwdc2024/10155/ • https://developer.apple.com/videos/play/wwdc2022/110340 •

    https://developer.apple.com/jp/videos/play/wwdc2021/10122/ • https://support.apple.com/ja-jp/111796 • https://developer.apple.com/documentation/accessibility/representing-chart-data-as-an-audio-graph • https://swiftwithmajid.com/2023/02/28/mastering-charts-in-swiftui-accessibility/ • https://www.data.jma.go.jp/stats/etrn/view/nml_sfc_ym.php?prec_no=44&block_no=47662&year=2023& month=&day=&view= 50