Вот базовый пример того, что не работает:
import SwiftUI
struct Test : View {
@State var swapped = false
var body: some View {
if swapped { Color.green }
Color.blue.tapAction {
withAnimation { self.swapped.toggle() }
}
if !swapped { Color.green }
}
}
SwiftUI не может выяснить, что я думаю о первом Color.green
и втором Color.green
как об одном и том же виде,поэтому, конечно, анимация просто затухает один из них, в то время как другой на новом месте.Я ищу способ указать SwiftUI, что это одно и то же представление, и анимировать его в новом месте.Я обнаружил модификатор .id()
с большим волнением, потому что полагал, что он даст мне нужный мне эффект:
import SwiftUI
struct Test : View {
@State var swapped = false
var body: some View {
if swapped { Color.green.id("green") }
Color.blue.tapAction {
withAnimation { self.swapped.toggle() }
}
if !swapped { Color.green.id("green") }
}
}
Это, к сожалению, тоже не работает.Я невероятно взволнован SwiftUI, но мне кажется, что способность изменять структуру иерархии представлений при сохранении идентичности представлений весьма важна.Фактический вариант использования, который побудил меня задуматься над этим, заключается в том, что у меня есть несколько видов, для которых я пытаюсь создать фанатскую анимацию.Простейшим способом было бы поместить элементы в ZStack
в одно состояние, чтобы они были все друг над другом, а затем поместить их в VStack
в разнесенном состоянии, чтобы они были вертикальноразложить и все видно.Изменение с ZStack
на VStack
, конечно, считается изменением структуры, и поэтому вся преемственность между состояниями теряется, а все просто пересекается.Кто-нибудь знает, что с этим делать?