You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Mac应用中的Swift Charts设置为Apple官方样式?

让Swift Charts匹配Apple官方样式的实现方案

直接上修改后的完整代码(包含示例数据,你可以直接测试):

// 先定义示例数据结构(你可以替换成自己的真实数据)
struct ChartData: Identifiable {
    let id = UUID()
    let count: Double
    let usage: String
}

// 模拟测试数据
let data: [ChartData] = [
    .init(count: 25, usage: "类型A"),
    .init(count: 40, usage: "类型B"),
    .init(count: 35, usage: "类型C")
]

struct BarChart: View {
    var body: some View {
        GroupBox {
            // 顶部标签
            HStack {
                Spacer()
                Text("This is the label")
                    .foregroundColor(.secondary)
            }
            .padding(.horizontal)
            
            // 标签与图表之间的细白分隔线
            Divider()
                .background(Color.white)
                .padding(.horizontal)
            
            // 包裹图表,实现圆角和内阴影
            ZStack {
                // 生成柔和内阴影的底层矩形
                RoundedRectangle(cornerRadius: 8)
                    .fill(Color(.windowBackgroundColor)) // 适配Mac窗口背景色
                    .shadow(color: .black.opacity(0.15), radius: 4, x: 0, y: 2)
                    .blendMode(.overlay)
                
                // 核心图表部分
                Chart(data) { item in
                    BarMark(
                        x: .value("% ", item.count)
                    )
                    .foregroundStyle(by: .value("Data:", item.usage))
                    // 柱子之间的细白分隔线(排除最后一根柱子)
                    .overlay(alignment: .trailing) {
                        if item.id != data.last?.id {
                            Color.white
                                .frame(width: 1)
                        }
                    }
                }
                .chartXAxis {
                    AxisMarks(values: .automatic(desiredCount: 0))
                }
                .padding(4) // 避免柱子贴到圆角边缘
            }
            .clipShape(RoundedRectangle(cornerRadius: 8)) // 上下圆角
            .padding(.bottom)
            
        }
        .padding()
    }
}

逐个解决你的三个需求:

1. 细白分隔线

  • 标签和图表区域的分隔:在顶部标签下方加Divider(),设置白色背景并添加水平padding,让分隔线和图表对齐。
  • 柱子之间的分隔:给每个BarMark添加右侧的1px白色overlay,判断不是最后一根柱子时显示,这样分组柱子之间就有清晰的细白线。

2. 上下圆角

把整个图表区域放在ZStack里,用clipShape(RoundedRectangle(cornerRadius: 8))统一裁剪成圆角(你可以把8改成自己喜欢的半径),同时给Chart内部加4px padding,防止柱子紧贴圆角边缘,样式更自然。

3. 柔和的内阴影

SwiftUI没有原生内阴影工具,用ZStack叠加实现:

  • 先画一个和图表容器同大小的圆角矩形,填充和窗口一致的背景色,添加阴影后用blendMode(.overlay)让阴影呈现内凹效果。
  • 把Chart放在这个阴影矩形上方,一起裁剪成圆角,就能得到和Apple官方图表一致的柔和内阴影质感。

内容的提问来源于stack exchange,提问作者granpaJones

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 03:05:15