Рассмотрим этот простой пример:
struct TestView: View {
@State private var enabled = false
var body: some View {
Circle()
.foregroundColor(.red)
.overlay(
Circle()
.foregroundColor(.blue)
.frame(width: 50, height: 50)
.animation(.spring())
)
.frame(width: 100, height: 100)
.offset(x: 0, y: enabled ? -50 : 50)
.animation(.easeIn(duration: 1.0))
.onTapGesture{
enabled.toggle()
}
}
}
Это дает следующую анимацию при нажатии на получившийся круг:
Вложенный круг анимируется в новое глобальное положение с помощью своей собственной функции синхронизации (пружина), в то время как внешний круг / родительский вид анимируется в новое глобальное положение с помощью функции времени easyInOut. В идеале все дочерние элементы должны анимироваться с помощью функции синхронизации родителей, если модификатор работает на уровне абстракции родительских представлений (в данном случае offset
, но также и такие вещи, как position
).
Предположительно это происходит потому, что механизм рендеринга SwiftUI вычисляет новые глобальные свойства для всех затронутых дочерних элементов в иерархии представлений на этапе макета и анимирует изменения каждого свойства на основе самого конкретного присоединенного модификатора анимации (хотя в данном случае относительное положение дочернего элемента в родительском не изменяется). И это делает невероятно трудным сделать что-то столь же простое, как правильный перевод представления, когда подвиды этого представления могут иметь свою собственную сложную анимацию (о которой родительское представление не знает и действительно не должно знать. ).
Еще одна особенность, которую я заметил, заключается в том, что в этом конкретном примере добавление модификатора animation(nil)
непосредственно перед модификатором смещения прерывает анимацию на внешнем круге, несмотря на то, что .easeInOut
остается прикрепленным непосредственно к модификатору смещения. Это нарушает мое понимание того, как эти модификаторы связаны, где (согласно этот источник) модификатор анимации применяется ко всем представлениям, которые он влечет за собой, до следующего вложенного модификатора анимации.