Моя задача сделать анимацию появления картинок из-за границ экрана, чтобы они “прилетали” из одной точки к месту своего расположения на экране. Для этого я сделал модификатор с анимированным значением, который осуществляет перемещение для каждой картинки. Но проблема в том, что при запуске приложения все картинки находятся сразу на своих местах и никакой анимации не случается. Я недавно начал изучать анимации в Swift и не могу разобраться что делаю неправильно.
Модификатор:
struct Flyingfy: GeometryEffect {
var endPoint: CGPoint
// анимируемые свойства
var offsetX: CGFloat
var offsetY: CGFloat
var animatableData: AnimatablePair<CGFloat, CGFloat> {
get {
return AnimatablePair<CGFloat, CGFloat>(offsetX, offsetY)
}
set {
offsetX = newValue.first
offsetY = newValue.second
}
}
func effectValue(size: CGSize) -> ProjectionTransform {
return ProjectionTransform(CGAffineTransform(a: 1, b: 0, c: 0, d: 1,
tx: offsetX,
ty: offsetY))
}
init(startPoint: CGPoint, endPoint: CGPoint) {
self.endPoint = endPoint
// все расстояние которое необходимо преодолеть по каждой из осей
self.offsetX = endPoint.x + abs(startPoint.x)
self.offsetY = endPoint.y + abs(startPoint.y)
}
}
extension View {
func flying(startPoint: CGPoint, endPoint: CGPoint) -> some View {
self.modifier(Flyingfy(startPoint: startPoint, endPoint: endPoint))
}
}
И возвращаю такое view
// точка откуда картинка начинает свой путь
let pointA = CGPoint(x: -50, y: -50) // значения отрицательные чтобы картинка "прилетела" из-за экрана
// точка куда картинка должна попасть в итоге
let pointB = viewLocationPoint
return viewForItem(item)
.frame(width: layout.itemSize.width,
height: layout.itemSize.height)
.aspectRatio(3/2, contentMode: .fill)
// помещаем картинку в начальную точку
.position(x: pointA.x, y: pointA.y)
// смещаем с помощью модификатора
.flying(startPoint: pointA, endPoint: pointB)
.animation(.easeInOut(duration: 2))
Вот что получается при запуске, картинки появляются без анимации сразу на своих местах