Swift: приостановить анимацию, которая движется по дорожке? - PullRequest
1 голос
/ 17 апреля 2019

У меня есть анимация пузыря, вот так:

func bubblePoint(_ value: CGFloat, midX: CGFloat) -> CGPoint {
    let startY: CGFloat = UIScreen.main.bounds.height
    let endY: CGFloat = -100

    let rangeX: CGFloat = UIScreen.main.bounds.width * 0.1

    let y = startY + (endY - startY) * value
    let x = sin(value * 4 * .pi) * rangeX * (0.1 + value * 0.9) + midX * UIScreen.main.bounds.width

    let point = CGPoint(x: x, y: y)
    return point
}

func bubblePath(midX: CGFloat) -> UIBezierPath {
    let path = UIBezierPath()
    path.move(to: bubblePoint(0, midX: midX))
    for value in stride(from: CGFloat(0.01), through: 1, by: 0.01) {
        path.addLine(to: bubblePoint(value, midX: midX))
    }
    return path
}

func createAnimation(midX: CGFloat, duration: CFTimeInterval) -> CAKeyframeAnimation {
    let animation = CAKeyframeAnimation(keyPath: "position")
    animation.path = bubblePath(midX: midX).cgPath
    animation.duration = duration
    animation.repeatCount = Float.infinity
    return animation
}

func createBubble(midX: CGFloat, duration: CFTimeInterval) -> (UIImageView, CAKeyframeAnimation) {
    return (
        view: UIImageView().then {
            $0.image = image
        },
        animation: createAnimation(midX: midX, duration: duration)
    )
}

let bubbles = createBubble(midX: 100,    duration: 11, )
bubble.layer.add(animation, forKey: nil)

Я хочу приостановить всплывающее окно, когда пользователь переходит на другой экран (и затем возобновить анимацию, когда пользователь возвращается). Я искал решение, подобное this , но я бы не знал, как это сделать с анимацией, которая использует путь, подобный моему. Это практично для этого?

1 Ответ

3 голосов
/ 17 апреля 2019

Существует два основных способа приостановить (заморозить) анимацию.Одним из них является установка слоя speed на ноль.Другой способ - обернуть анимацию в UIViewPropertyAnimator и приостановить работу аниматора (вы можете сделать это даже с анимацией ключевого кадра).

Обратите внимание, однако, что, когда «пользователь переходит на другой экран», анимация может быть удаленаполностью.Таким образом, вам может потребоваться сохранить информацию о том, где в анимации мы были, и начать отсюда, когда ваш контроллер представления вернется на экран.

...