
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{guardletfirststeps.first,letlaststeps.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:[])}letxAxisAXDateDataAxisDescriptor(title:Date,range:first.date...last.date,gridlinePositions:[])letyAxisAXNumericDataAxisDescriptor(title:Steps,range:0...Double(steps.map(\.count).max()??0),gridlinePositions:[]){\(Int($0))steps}letseriesAXDataSeriesDescriptor(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:ClosedRangeInt?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 16Chart、自定义坐标轴、比例尺、BarMark、LineMark、AreaMark、PointMark、RectangleMark、RuleMark、ChartProxy、chartOverlay、chartBackgroundiOS 17SectorMark、chartXSelection、chartYSelection、chartAngleSelection、chartScrollableAxes、可见域滚动 API、chartGestureiOS 18AreaPlot、BarPlot、LinePlot、PointPlot、RectanglePlot、RulePlot、SectorPlot、函数绘图iOS 26Chart3D、SurfacePlot、Z 轴 mark、3D 相机与姿态 APIWWDC 会话Hello Swift ChartsWWDC 2022——框架介绍Swift Charts: Raise the barWWDC 2022——mark、组合、自定义Design an effective chartWWDC 2022——图表设计原则Design app experiences with chartsWWDC 2022——将图表集成到应用体验中Explore pie charts and interactivity in Swift ChartsWWDC 2023——SectorMark、选择、滚动Swift Charts: Vectorized and function plotsWWDC 2024——LinePlot、AreaPlot、函数绘图Bring Swift Charts to the third dimensionWWDC 2025——Chart3D、SurfacePlot、3D mark汇总清单使用图表类型的文件中有import Charts部署目标与所用 API 匹配iOS 16 用ChartiOS 17 用选择和SectorMarkiOS 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 无障碍