news 2026/10/31 0:53:29

swiftui-expert-skill - charts-accessibility

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
swiftui-expert-skill - charts-accessibility

Swift Charts 无障碍、回退与资源

目录

  • 无障碍
    • 有意义的标签
    • 自定义 Audio Graphs
  • 综合示例
  • 回退策略
    • 版本细分
  • WWDC 会话
  • 汇总清单

无障碍

Swift Charts 提供内置的无障碍支持。VoiceOver 用户会自动获得三个转子操作:

  • 描述图表(Describe Chart)——坐标轴和数据系列的概览
  • 音频图形(Audio Graph)——用音高表示数据值的声波化
  • 图表详情(Chart Detail)——用于探索单个数据点的交互模式

有意义的标签

务必在.value(_, _)调用中使用清晰、描述性的字符串。这些标签会被 VoiceOver 朗读并用于 Audio Graph。

// 好 —— 描述性标签LineMark(x:.value("Date",entry.date),y:.value("Daily Steps",entry.count))// 坏 —— 通用标签LineMark(x:.value("X",entry.date),y:.value("Y",entry.count))

自定义 Audio Graphs

对于高级无障碍支持,让你的图表视图遵循AXChartDescriptorRepresentable并实现makeChartDescriptor()。用.accessibilityChartDescriptor(self)附加它。

structStepsChart:View,AXChartDescriptorRepresentable{letsteps:[DailySteps]varbody:someView{Chart(steps){dayinLineMark(x:.value("Date",day.date),y:.value("Steps",day.count))}.accessibilityChartDescriptor(self)}funcmakeChartDescriptor()->AXChartDescriptor{guardletfirst=steps.first,letlast=steps.lastelse{returnAXChartDescriptor(title:"Daily Step Count",summary:nil,xAxis:AXNumericDataAxisDescriptor(title:"Date",range:0...1,gridlinePositions:[]){"\($0)"},yAxis:AXNumericDataAxisDescriptor(title:"Steps",range:0...1,gridlinePositions:[]){"\($0)"},additionalAxes:[],series:[])}letxAxis=AXDateDataAxisDescriptor(title:"Date",range:first.date...last.date,gridlinePositions:[])letyAxis=AXNumericDataAxisDescriptor(title:"Steps",range:0...Double(steps.map(\.count).max()??0),gridlinePositions:[]){"\(Int($0))steps"}letseries=AXDataSeriesDescriptor(name:"Daily Steps",isContinuous:true,dataPoints:steps.map{.init(x:$0.date,y:Double($0.count))})returnAXChartDescriptor(title:"Daily Step Count",summary:nil,xAxis:xAxis,yAxis:yAxis,additionalAxes:[],series:[series])}}

综合示例

一个结合多个 iOS 17+ API 的、带范围选择的可滚动条形图:

@StateprivatevarselectedRange:ClosedRange<Int>?Chart(weeklyRevenue){weekinBarMark(x:.value("Week",week.index),y:.value("Revenue",week.revenue)).foregroundStyle(by:.value("Region",week.region))}.chartScrollableAxes(.horizontal).chartXVisibleDomain(length:8).chartXSelection(range:$selectedRange).chartXAxis{AxisMarks(values:.stride(by:1)){AxisGridLine()AxisValueLabel{Text("W\($0.as(Int.self)??0)")}}}

回退策略

用#available门控高级 API,并提供不带被门控功能回退图表。由于.chartXSelection等图表修饰符会改变返回类型,你必须复制整个Chart——你无法有条件地应用修饰符:

版本细分

  • iOS 16+:Chart、自定义坐标轴、比例尺、BarMark、LineMark、AreaMark、PointMark、RectangleMark、RuleMark、ChartProxy、chartOverlay、chartBackground
  • iOS 17+:SectorMark、chartXSelection、chartYSelection、chartAngleSelection、chartScrollableAxes、可见域滚动 API、chartGesture
  • iOS 18+:AreaPlot、BarPlot、LinePlot、PointPlot、RectanglePlot、RulePlot、SectorPlot、函数绘图
  • iOS 26+:Chart3D、SurfacePlot、Z 轴 mark、3D 相机与姿态 API

WWDC 会话

  • Hello Swift Charts(WWDC 2022)——框架介绍
  • Swift Charts: Raise the bar(WWDC 2022)——mark、组合、自定义
  • Design an effective chart(WWDC 2022)——图表设计原则
  • Design app experiences with charts(WWDC 2022)——将图表集成到应用体验中
  • Explore pie charts and interactivity in Swift Charts(WWDC 2023)——SectorMark、选择、滚动
  • Swift Charts: Vectorized and function plots(WWDC 2024)——LinePlot、AreaPlot、函数绘图
  • Bring Swift Charts to the third dimension(WWDC 2025)——Chart3D、SurfacePlot、3D mark

汇总清单

  • 使用图表类型的文件中有import Charts
  • 部署目标与所用 API 匹配(iOS 16+ 用Chart,iOS 17+ 用选择和SectorMark,iOS 18+ 用绘图类型,iOS 26+ 用Chart3D)
  • 图表数据模型使用Identifiable(或提供了Chart(data, id:))
  • 所有图表系列都用正确的 mark 类型表示
  • 当默认刻度过密或不清晰时,坐标轴使用AxisMarks
  • 当固定范围很重要时,设置了chartXScale或chartYScale
  • 图表级修饰符应用于Chart,而不是单个 mark
  • 分类系列使用foregroundStyle(by:)(而不是手动逐 mark 设置颜色)
  • 单值选择使用chartXSelection(value:)或chartYSelection(value:)
  • 范围选择使用chartXSelection(range:)或chartYSelection(range:)
  • SectorMark选择使用chartAngleSelection(value:)
  • iOS 17+、iOS 18+ 和 iOS 26+ API 都用#available保护
  • .value()标签描述性强,便于 VoiceOver 和 Audio Graph 无障碍
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/31 8:40:03

AnyPS5:PS5手柄跨平台全功能协议适配技术解析

1. “AnyPS5”不是产品&#xff0c;而是一类技术探索的代号最近在多个开发者社区、硬件极客论坛和跨平台工具讨论区里&#xff0c;“AnyPS5”这个词频繁出现&#xff0c;但几乎找不到它作为正式产品或官方项目的任何注册信息、发布页面或技术文档。它不隶属于某家厂商&#xff…

作者头像 李华
网站建设 2026/10/30 14:02:22

CHARLS数据清洗实战:跨wave对齐、缺失编码与面板构造

简介&#xff1a;这份CHARLS数据清洗教程项目源码面向健康经济学、社会学与人口统计学方向的研究者及数据分析学习者&#xff0c;聚焦中国大陆45岁及以上人群追踪调查数据的清洗、拼接与整理难题。资源包共8个文件&#xff0c;以R脚本为核心&#xff0c;包含数据清洗、示例分析…

作者头像 李华
网站建设 2026/10/23 9:57:37

AI日报全流程拆解:从信息采集到深度内容生产的方法论

1. 一份AI日报的诞生逻辑&#xff1a;为什么值得认真做每天早上八点半&#xff0c;我会准时打开自己维护的AI日报文档&#xff0c;把过去24小时里散落在各个角落的信息碎片拼成一张完整的图景。这件事听起来简单&#xff0c;但真正做过的人都知道&#xff0c;一份高质量的AI日报…

作者头像 李华
网站建设 2026/10/19 9:34:50

SpringBoot构建高校数字化校园平台的技术实践

1. 项目概述校园平台综合服务系统是当前高校数字化转型的核心载体。作为一名参与过多个高校信息化项目的开发者&#xff0c;我发现SpringBoot框架因其"约定优于配置"的特性&#xff0c;特别适合快速构建这类业务复杂度高、需求变化频繁的系统。这个校园服务平台的设计…

作者头像 李华
网站建设 2026/10/19 9:34:50

C语言可视化排序沙盒:8种算法原理与动画实现

1. 这不是“背代码”&#xff0c;而是理解数据如何被驯服的过程你打开任何一本C语言教材&#xff0c;翻到“排序”这一章&#xff0c;大概率会看到几段缩进整齐、变量名规整的代码&#xff1a;for (int i 0; i < n-1; i)、if (a[j] > a[j1])、swap(&a[j], &a[j1…

作者头像 李华
网站建设 2026/10/19 11:35:41

好想找人玩:成年人社交与独处的自我修复指南

下午五点&#xff0c;写完当天的工作日志&#xff0c;我打开微信&#xff0c;翻了一遍最近的聊天列表&#xff0c;最后停留在对话框里打了四个字&#xff0c;又删掉。过了一会儿又打出来&#xff1a;“好想找人玩儿。”发送键最终还是没有按下去。这就是标题里那篇659字日记的来…

作者头像 李华