是否可以在Swift图表中使用SFSymbol作为条形标记?

fdbelqdn  于 2023-11-16  发布在  Swift
关注(0)|答案(1)|浏览(205)

我想在条形图中使用符号来表示用户指定的习惯。文本可能太长,会被下一个图表截断。
以下是我尝试的:

Chart {
    ForEach(habitItems) { habit in
        BarMark(x: .value("Type", Image(systemName: habit.symbolHI)),
                y: .value("Tracked", countTrackedDates(for: habit))
                )
        .foregroundStyle(getBarColor(for: habit).gradient)
        .cornerRadius(20)
    }
}

字符串
habit.symbolHI等于一个字符串,例如:"square.fill"
我得到一个错误:
初始化器“init(x:y:width:height:stacking:)”要求“Image”符合“Ploconline”
也许有一种方法可以使图像放大,但我不知道如何。

pprl5pva

pprl5pva1#

为了简单起见,我假设你有一个数组:

struct Habit: Identifiable {
    let symbolName: String
    let count: Int
    let color: Color
    
    var id: String { symbolName }
}

字符串
您可以只绘制图像的名称。

BarMark(x: .value("Type", habit.symbolName),
        y: .value("Tracked", habit.count)
        )


然后使用chartXAxis将X轴标记更改为图像:

Chart {
    ...
}
.chartXAxis {
    AxisMarks { value in
        AxisValueLabel {
            Image(systemName: value.as(String.self)!)
                .font(.system(size: 30))
        }
    }
}


我在这里将value转换为String,因为我知道我在x轴上绘制字符串(如x: .value("Type", habit.symbolName))。如果x轴标记的索引与数据的索引匹配,则也可以使用habitItems[value.index].symbolName(如果数据是Array,则可以使用habitItems[value.index].symbolName,但如果数据是ArraySlice,则不能使用ArraySlice)。

相关问题