У меня проблема с анимацией гистограмм. Я хочу, чтобы при изменении данных столбцы менялись вверх и вниз, как на этой гифке. Но animation(.easeIn) дает мне какую-то странную анимацию. Что я делаю не так? Заранее спасибо!
import SwiftUI
import Charts
struct ContentView: View {
enum chartPeriods: Equatable{
case week
case month
}
@State var selectedChartPeriod: chartPeriods = .month
struct BarData: Identifiable, Equatable {
var type: String
var count: Double
var id = UUID()
}
var monthData: [BarData] = [
.init(type: "Jan", count: 100),
.init(type: "Feb", count: 200),
.init(type: "Mar", count: 300)
]
var weekData: [BarData] = [
.init(type: "1", count: 3000),
.init(type: "2", count: 2000),
.init(type: "3", count: 4000),
.init(type: "4", count: 1000)
]
var data: [BarData] {
switch selectedChartPeriod {
case .month:
return monthData
case .week:
return weekData
}
}
var body: some View {
VStack {
Picker("", selection: $selectedChartPeriod.animation(.easeIn)){
Text("Week")
.tag(chartPeriods.week)
Text("Month")
.tag(chartPeriods.month)
}
.pickerStyle(.segmented)
Chart(data) {
BarMark(
x: .value("Date", $0.type),
y: .value("Sales", $0.count)
)
}
.chartYAxis(.hidden)
.frame(height: 300)
Spacer()
}
.padding()
}
}





Ваш BarData соответствует Identifiable, однако для каждого столбца будет создан другой UUID. Таким образом, диаграмма не могла определить позиции столбцов, поскольку у нее был другой идентификатор. Вам нужно исправить тот же идентификатор, чтобы анимация работала.
struct BarData: Identifiable, Equatable {
var type: String
var count: Double
var id: Int //<- Change it to Int for example
}
//Then mock data is something like
.init(type: "Jan", count: 100, id: 1),
.init(type: "Feb", count: 200, id: 2),
...
.init(type: "1", count: 3000, id: 1),
.init(type: "2", count: 2000, id: 2),
Выход:
Точно напишите «какая-то странная анимация», чтобы никого не ввести в заблуждение.