UIViewPropertyAnimator repeat - PullRequest
       7

UIViewPropertyAnimator repeat

1 голос
/ 13 января 2020

Я взглянул на ответы в следующем вопросе StackOverflow, но, похоже, ни один из них мне не подходит: при выполнении блока завершения вместо повторного выполнения анимации программа выдает «завершено» до бесконечности без анимация представления вообще.

Как я могу повторять анимацию (используя UIViewPropertyAnimator) определенное количество раз?

Это мой AnimatorFactory класс:

class AnimatorFactory {

    @discardableResult
    static func rotateRepeat(view: UIView) -> UIViewPropertyAnimator {
        let rotate = UIViewPropertyAnimator.runningPropertyAnimator(withDuration: 1.0, delay: 0.0, options: [.curveLinear], animations: {
            view.transform = CGAffineTransform(rotationAngle: .pi)
        }, completion: { _ in
            print("complete")
            self.rotateRepeat(view: view)
        })

        return rotate
    }

}

Он вызывается, как и следовало ожидать, с AnimatorFactory.rotateRepeat(view: <someView>)

Однако возникает проблема, как указано выше. Я ожидаю, что представление будет вращаться несколько раз, пока я не решу изменить или остановить его; Именно по этой причине я выбрал UIViewPropertyAnimator вместо UIView.animate(withDuration:animations).

Каков наилучший способ создания интерактивных повторяемых анимаций UIView? Очень ценится.

Ответы [ 2 ]

1 голос
/ 13 января 2020

Как подсказал @matt, я просто устанавливал поворот вида на .pi снова и снова. Таким образом, в блоке завершения я установил преобразование в .identity перед тем, как снова запустить анимацию.

class AnimatorFactory {

    @discardableResult
    static func rotateRepeat(view: UIView) -> UIViewPropertyAnimator {
        let rotate = UIViewPropertyAnimator(duration: 1.0, curve: .linear)
        rotate.addAnimations {
            view.transform = CGAffineTransform(rotationAngle: .pi)
        }
        rotate.addCompletion{ _ in
            view.transform = .identity
            self.rotateRepeat(view: view)
        }
        rotate.startAnimation()

        return rotate
    }

}
1 голос
/ 13 января 2020

Ваш код работает нормально. Проблема в том, что ваша анимация ничего не делает после первого раза. Вы говорите:

view.transform = CGAffineTransform(rotationAngle: .pi)

В первый раз мы меняем вращение с 0 на пи. Это изменение, поэтому есть анимация. Но после этого мы просто продолжаем говорить «оставайся на пи» снова и снова. Мы находимся на пи, и вы говорите, чтобы остаться там, так что нет никаких изменений в анимации.

То, что вы хотите сделать для каждой анимации, это добавить пи, а не быть пи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...