Как установить разные времена animation.duration для пунктов 1–2 и 2–3 для imageView, следующих за BezierPath в Swift? - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть подпредставление UIView с BezierPath и ImageView, которое следует по пути от a до b.Путь имеет 8 точек, и мне нужно, чтобы точки от 1 до 2 имели разную продолжительность, от точки 2 до точки 3 и т. Д.

Мне удалось настроить вид и путь и анимировать изображение вдоль путино с той же продолжительностью для полной анимации.Вот мой код для анимации, любая помощь будет принята с благодарностью.

let pathToFollow = path
    let animation = CAKeyframeAnimation(keyPath: #keyPath(CALayer.position))
    animation.path = pathToFollow?.cgPath
    animation.duration = 10.0
    animation.calculationMode = kCAAnimationPaced
    animation.delegate = self
    self.icons[Icon].layer.add(animation, forKey: nil)

1 Ответ

0 голосов
/ 06 декабря 2018

У вас есть анимация ключевого кадра, которая является хорошим началом.Но вы забыли добавить некоторые фактические кадры!Для этого поставьте немного keyTimes.(И удалите kCAAnimationPaced; это означает, что вся анимация имеет одну скорость, что противоположно тому, что вы сказали, что вы хотели.)

Обратите внимание, что с анимацией пути этого вида, разделение кадровточки - это точки Безье, используемые для определения пути, поэтому все будет зависеть от того, как путь был построен в первую очередь.

Вот фактический пример:

enter image description here

Наблюдайте, как мы ускоряемся на каждом углу, когда мы продвигаемся вокруг квадрата.Углы находятся там, где находятся контрольные точки.Вот код, который я использовал:

    let path = CGPath(rect: CGRect(x: 120, y: 120, width: 100, height: 100), 
        transform: nil)
    let anim = CAKeyframeAnimation(keyPath: #keyPath(CALayer.position))
    anim.duration = 10
    anim.path = path
    anim.calculationMode = .linear
    anim.keyTimes = [0.0, 0.7, 0.9, 0.98, 1.0]
    self.v.layer.add(anim, forKey: nil)
...