移动/游戏
在 Apple 平台用 Swift Charts 构建…
适用于使用 SwiftUI/Swift Charts 实现或评审 2D/3D 图表、矢量绘图、交互选择、滚动、注释、图例和无障碍的场景。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
在 Apple 平台用 Swift Ch特定
解决思路
- 新建图表:将数据定义为 Identifiable struct 或使用 id key path。
- 新建图表:选择 mark 类型:BarMark、LineMark、PointMark、AreaMark、RuleMark、RectangleMark、SectorMark 或 SurfacePlot。
- 新建图表:2D marks 包在 Chart;只有真实空间或表面数据使用 Chart3D。
- 新建图表:编码视觉通道:.foregroundStyle(by:)、.symbol(by:)、.lineStyle(by:)。
- 新建图表:用 .chartXAxis / .chartYAxis 配置轴。
- 新建图表:用 .chartXScale(domain:) / .chartYScale(domain:) 设置比例域。
- 新建图表:按需添加 selection、scrolling 或 annotations。
- 新建图表:1000+ 个 2D 数据点使用 vectorized plots(BarPlot、LinePlot 等)。
- 新建图表:渲染空、典型、密集、大文本、高对比和 VoiceOver 代表性状态;存在 selection/scrolling 时演练它们。
- 新建图表:如果 encoding、axis、selection 或 accessibility 检查失败,恢复数据 fixture,修一层,重新运行同一矩阵,再添加装饰。
- 审查现有图表:先识别数据语义,再判断 mark 选择。
- 审查现有图表:追踪每个值经过 mark、scale、axis、style、selection 和 accessibility 输出,并运行与新图表相同的验证矩阵。
- Chart 容器:单一集合用数据驱动初始化器 Chart(sales) { item in ... }。
- Chart 容器:混合 marks 或多系列用 content closure;元素非 Identifiable 时传 id:。
- Chart 容器:需要完整 mixed-series、theming、accessibility、3D 配方时加载 references/charts-patterns.md。
- BarMark:垂直柱使用 x/y 映射。
- BarMark:相同 x 映射多个柱时自动堆叠,并用 .foregroundStyle(by:) 按产品编码。
- BarMark:水平柱交换 x/y 映射。
- BarMark:区间柱用 xStart/xEnd/y 映射做 Gantt 图。
- LineMark:单线使用 x/y 映射。
- LineMark:多系列用 .foregroundStyle(by:) 按城市编码,并可选 .interpolationMethod(.catmullRom)。
- LineMark:多系列也可用 series: .value 显式指定 ticker。
- PointMark:x/y 映射,用 .foregroundStyle(by:)、.symbol(by:)、.symbolSize(100) 编码。
- AreaMark:堆叠面积用 .foregroundStyle(by:) 按类别编码。
- AreaMark:范围带用 yStart/yEnd 映射并设置 .opacity(0.3)。
- RuleMark:阈值线用 y 映射,设置 .foregroundStyle(.red)、.lineStyle(StrokeStyle(dash: [5, 3])),并用 .annotation 添加标签。
- RectangleMark:用 x/y 映射,并用 .foregroundStyle(by:) 按强度编码,适合热力图。
- SectorMark:只用于严格正值;在饼图/甜甜圈外过滤、聚合或解释零/负值。
- SectorMark:饼图用 angle 映射并用 .foregroundStyle(by:) 按类别编码。
- SectorMark:甜甜圈设置 innerRadius: .ratio(0.618)、outerRadius: .inset(10)、angularInset: 1、.cornerRadius(4)。
- 轴定制:用 .chartXAxis(.hidden) / .chartYAxis(.hidden) 隐藏轴。
- 轴定制:用 .chartXAxis { AxisMarks(values: .stride(by: .month)) { ... AxisGridLine(); AxisTick(); AxisValueLabel(format: .dateTime.month(.abbreviated)) } } 自定义轴内容。
- 轴定制:用多个 AxisMarks 组合,不同间隔用于网格和标签,例如每日 AxisGridLine、每周 AxisTick + AxisValueLabel(format: .dateTime.week())。
- 轴定制:用 .chartXAxisLabel / .chartYAxisLabel 添加轴标题并设置 position、alignment。
- 比例配置:用 .chartYScale(domain: 0...100) 显式数值域。
- 比例配置:用 .chartYScale(domain: .automatic(includesZero: true)) 包含零。
- 比例配置:用 .chartYScale(domain: 1...10000, type: .log) 对数比例。
- 比例配置:用 .chartXScale(domain: [...]) 设置分类顺序。
- 前景样式与编码:用 .foregroundStyle(.blue) 设置静态颜色。
- 前景样式与编码:用 .foregroundStyle(by: .value(...)) 按数据编码。
- 前景样式与编码:用 .linearGradient(colors: [.blue, .cyan], startPoint: .bottom, endPoint: .top) 设置渐变。
- Selection:用 @State 声明 selectedDate、selectedRange、selectedAngle 等绑定。
- Selection:点选择用 .chartXSelection(value: $selectedDate)。
- Selection:范围选择用 .chartXSelection(range: $selectedRange)。
- Selection:角度选择用 .chartAngleSelection(value: $selectedAngle),并从累计扇区范围推导类别。
- Scrollable:用 .chartScrollableAxes(.horizontal) 开启水平滚动。
- Scrollable:用 .chartXVisibleDomain(length: 3600 * 24 * 7) 设置可见 7 天。
- Scrollable:用 .chartScrollPosition(initialX: latestDate) 设置初始位置。
- Scrollable:用 .chartScrollTargetBehavior(.valueAligned(matching: DateComponents(hour: 0), majorAlignment: .page)) 设置滚动对齐。
- Annotations:在 mark 上用 .annotation(position: .top, alignment: .center, spacing: 4) 添加 Text,并用 format: .number 格式化。
- Annotations:用 overflowResolution: .init(x: .fit(to: .chart), y: .padScale) 解决溢出。
- Legend:用 .chartLegend(.hidden) 隐藏图例。
- Legend:用 .chartLegend(position: .bottom, alignment: .center, spacing: 10) 设置位置。
- Legend:用 .chartLegend(position: .bottom) { HStack { ForEach(categories, id: ...) { Label(cat, systemImage: circle.fill).font(.caption) } } } 自定义图例。
- Vectorized:1000+ 点使用 vectorized plots。
- Vectorized:数据驱动用 BarPlot(sales, x: .value(...), y: .value(...)) 并按 KeyPath 设置前景样式。
- Vectorized:函数绘图 y=f(x) 用 LinePlot 指定 x、y、domain,并传入闭包 sin(x)。
- Vectorized:参数绘图 (x,y)=f(t) 用 LinePlot 指定 x、y、t、domain,并传入闭包返回 cos(t) 和 sin(t)。
- Vectorized:在 vectorized plots 上先应用基于 KeyPath 的修饰符,再应用简单值修饰符,例如先前景样式再 opacity。
- 3D:只有空间数据或双变量表面使用 Chart3D,不要作为普通 2D 分类或时间序列图的装饰替代。
- 3D:Chart3D 接受 SurfacePlot 以及 PointMark、RuleMark、RectangleMark 的 3D 初始化器。
- 3D:用 SurfacePlot 指定 x、y、z,并用闭包计算 sin(2 * x) * cos(2 * z),再设置 .foregroundStyle(.heightBased)。
- 3D:用 .chartXScale(domain: -2...2)、.chartYScale(domain: -1...1)、.chartZScale(domain: -2...2)、.chart3DPose($pose) 配置。
- 常见错误:多线图不要遗漏 series 参数或按系列编码,否则所有点连成一条线;正确用 .foregroundStyle(by:) 或 series:。
- 常见错误:不要给 SectorMark 太多切片;将类别分组为前 5 + Other。
- 常见错误:零基线重要时不要遗漏 scale domain;用 .chartYScale(domain:) 显式设置。
- 常见错误:不要用静态 .foregroundStyle(.blue) 覆盖 .foregroundStyle(by:) 数据编码;只保留数据编码。
- 常见错误:不要为 10000+ 数据点创建单个 mark;改用 PointPlot 等 vectorized plot。
- 常见错误:不要用固定 .frame(height: 200) 破坏 Dynamic Type;改用 .frame(minHeight: 200, maxHeight: 400)。
- 常见错误:不要在 vectorized plots 的值修饰符之后应用 KeyPath 修饰符;KeyPath 修饰符必须先。
- 常见错误:不要缺少 accessibility labels;给 mark 添加 .accessibilityLabel 和 .accessibilityValue。
- 常见错误:不要把角度选择当作类别选择;chartAngleSelection(value:) 绑定数值角度,需通过累计扇区范围映射到类别。
- 审查清单:检查数据模型使用 Identifiable 或图表使用 id key path。
- 审查清单:检查 mark 类型匹配目标(bar=比较,line=趋势,sector=比例)。
- 审查清单:检查多系列线使用 series: 参数或 .foregroundStyle(by:)。
- 审查清单:检查轴配置了合适的标签、刻度、网格线。
- 审查清单:检查零基线重要时显式设置 scale domain。
- 审查清单:检查饼图/甜甜圈使用正值、5-7 个扇区、Other 分组。
- 审查清单:检查 selection 绑定类型匹配轴数据类型(日期轴用 Date?)。
- 审查清单:检查饼图/甜甜圈角度选择把数值角度映射回类别。
- 审查清单:检查可滚动图表设置 .chartXVisibleDomain(length:) 定义视口。
- 审查清单:检查超过 1000 点的数据集使用 vectorized plots。
- 审查清单:检查 vectorized plots 上 KeyPath 修饰符先于值修饰符。
- 审查清单:检查 Chart3D 仅用于真实 3D 数据或表面,并审查 z scale 和 pose。
- 审查清单:检查为 VoiceOver 给 marks 添加 accessibility labels。
- 审查清单:检查图表在 Dynamic Type 和 Dark Mode 下测试。
- 审查清单:检查图例可见并定位,或刻意隐藏。
- 审查清单:确保图表数据模型类型 Sendable;在 @MainActor 更新图表数据。
- 参考:需要扩展模式、3D 图表、accessibility 和 theming 时查阅 references/charts-patterns.md。
- 参考:查阅 Apple docs 的 Swift Charts、Creating a chart using Swift Charts、Swift Charts updates、Chart3D、SurfacePlot。
适用边界 · 注意事项
- 非 Apple 平台、非 SwiftUI/Swift 项目,或未使用 Swift Charts 的项目不适用。
- 目标部署版本低于特性要求时不适用对应特性:SectorMark、selection、scrollable 需 iOS 17+;vectorized plots 需 iOS 18+;Chart3D 需 iOS 26+。
- 没有真实空间或双变量表面数据时,不要用 Chart3D 作为装饰性替代。