In Swiftui möchte ich ordnungsgemäße Animationen, wenn eine Liste von Zeilen die Reihenfolge ändert, gleichzeitig, wenn der Zeileninhalt die Werte ändert. Funktioniert mit List , funktioniert nicht mit Vstack /
Code: Select all
HStack
Ich habe ein gemeinsames Setup, aber ich kann keine perfekten Animationen erreichen. Eigenschaft. < /li>
Die Liste wird nach dieser Eigenschaft sortiert. < /li>
Über eine Änderung der Eigenschaft - das Zeilenetikett muss animieren, aber die Gesamtreihen selbst ändern sich möglicherweise auch und müssen auch animieren. /> Eine Liste von Kommentaren. Die Zeilenanimation.
Code: Select all
LazyVStack
Das Problem ist das gleiche, unabhängig davon, ob LazyvStack /vstack verwendet wird.
Code: Select all
struct ContentView: View {
@State private var comments: [Comment] = []
var body: some View {
HStack {
Text("Sate 1").onTapGesture { comments = [.init("Well done", 6), .init("Interesting", 5), .init("Nice", 4)] }
Text("Sate 2").onTapGesture { comments = [.init("Interesting", 7), .init("Well done", 6), .init("Nice", 4)] }
}
// Option 1: Animation glitch
VStack { ForEach(comments, content: CommentRowView.init(comment:)) }
.padding()
.animation(.default, value: comments)
// Option 2: Works, but uses `List`
// List { ForEach(comments, content: CommentRowView.init(comment:)) }
// .animation(.default, value: comments)
}
}
struct CommentRowView: View {
let comment: Comment
var body: some View {
HStack {
Text(comment.text).font(.largeTitle)
Spacer()
VStack {
Text(comment.upvotes.formatted())
.contentTransition(.numericText())
.animation(.default, value: comment.upvotes)
}
.font(.title)
}.padding().border(.gray)
}
}
struct Comment: Identifiable, Equatable {
var id: String { text }; let text: String; let upvotes: Int
init(_ text: String, _ upvotes: Int) { self.text = text; self.upvotes = upvotes }
}