SwiftUI Charts中如何基于SwiftData模型的自定义颜色属性设置折线图(LineMark)的折线颜色
SwiftUI Charts中如何基于SwiftData模型的自定义颜色属性设置折线图(LineMark)的折线颜色
当然可以实现!你现在用的foregroundStyle(by:)是让Charts框架自动给每个分类分配默认颜色,我们只需要稍微调整代码,就能绑定到Parts模型里的自定义color属性。下面给你两种可行的方案:
方法一:直接给折线绑定自定义颜色(简单直接)
这种方法最直观,直接把每个LineMark的前景色设置为对应Part的color属性就行,完全跳过系统的自动颜色分配:
Chart { ForEach(parts) { part in ForEach(part.orders.sorted(by: { $0.date < $1.date })) { order in LineMark( x: .value("Time", order.date), y: .value("Amount", order.amount) ) // 直接使用Part模型里的自定义颜色 .foregroundStyle(part.color) } } }
注意点:
- 这样设置后,系统不会自动生成图例(因为我们没有用
foregroundStyle(by:)来标记分类)。如果需要图例,你可以手动添加,比如在图表里加入隐藏的标记来生成图例项,或者用下面的方法二。
方法二:自定义颜色映射表(保留自动图例)
如果你还想保留Charts框架自动生成的图例(每个Part的名称和对应颜色),可以用chartForegroundStyleScale来创建一个自定义的颜色映射,把每个Part的名称和它的颜色关联起来:
// 先创建一个名称到颜色的映射字典 let colorMapping = Dictionary(uniqueKeysWithValues: parts.map { ($0.name, $0.color) }) Chart { ForEach(parts) { part in ForEach(part.orders.sorted(by: { $0.date < $1.date })) { order in LineMark( x: .value("Time", order.date), y: .value("Amount", order.amount) ) // 还是用分类值来关联图例 .foregroundStyle(by: .value("Part", part.name)) } } } // 用自定义的颜色映射替换系统默认的颜色 .chartForegroundStyleScale(domain: colorMapping.keys, range: colorMapping.values)
为什么这个方法有效?
chartForegroundStyleScale可以让我们覆盖Charts框架的默认颜色集,用我们自己的颜色字典来对应每个分类值(这里就是Part的名称),这样既保留了自动生成的图例,又能使用模型里的自定义颜色。
两种方法都能完美解决你的问题,你可以根据是否需要图例来选择~
备注:内容来源于stack exchange,提问作者awado
相关产品推荐
相关产品推荐

