Tenho um gráfico Swift simples onde estou tentando colocar uma RuleMark atrás de uma BarMark.
Quando o RuleMark é incluído antes do BarMark, as barras ficam irregulares e se movem conforme a seleção avança. Exemplo reproduzível abaixo.
import SwiftUI
import Charts
struct datStruct: Identifiable {
let id = UUID()
let label: String
let value: Int
}
struct ContentView: View {
let dat = [
datStruct(label: "A", value: 1),
datStruct(label: "B", value: 2),
datStruct(label: "C", value: 3)
]
@State var rawSelection: String?
var selection: datStruct? {
guard let rawSelection else {return nil}
return dat.first(where: { $0.label == rawSelection })
}
var body: some View {
Chart(){
if let selection {
RuleMark(x: .value("label", selection.label))
.foregroundStyle(.red)
}
ForEach(dat) {dat in
BarMark(x: .value("label", dat.label), y: .value("count", dat.value))
}
}
.chartXSelection(value: $rawSelection)
}
}
#Preview {
ContentView()
}
Quando a RuleMark é movida para depois da BarMark e um ZIndex negativo é aplicado, a regra é exibida atrás da barra, conforme desejado. Mas, quando adiciono animação à seleção, a regra aparece brevemente acima da barra e, em seguida, é animada para trás dela.
Como posso sempre mostrar o RuleMark atrás do BarMark com animação aplicada?
import SwiftUI
import Charts
struct datStruct: Identifiable {
let id = UUID()
let label: String
let value: Int
}
struct ContentView: View {
let dat = [
datStruct(label: "A", value: 1),
datStruct(label: "B", value: 2),
datStruct(label: "C", value: 3)
]
@State var rawSelection: String?
var selection: datStruct? {
guard let rawSelection else {return nil}
return dat.first(where: { $0.label == rawSelection })
}
var body: some View {
Chart(){
ForEach(dat) {dat in
BarMark(x: .value("label", dat.label), y: .value("count", dat.value))
}
if let selection {
RuleMark(x: .value("label", selection.label))
.foregroundStyle(.red)
.zIndex(-1)
}
}
.chartXSelection(value: $rawSelection.animation())
}
}
#Preview {
ContentView()
}