如何将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
相关产品推荐
相关产品推荐

