Встряхните представление с помощью UIViewPropertyAnimator

#swift #uikit #uiviewpropertyanimator

Вопрос:

Я пытаюсь закодировать функцию встряхивания с помощью обработчика завершения. Когда я вызываю функцию, я вижу само сотрясение, но его величина намного меньше желаемых значений. Пожалуйста, взгляните на код и помогите мне исправить ошибку.

 func shake(_ completion: @escaping () -> Void) {
    let animator = UIViewPropertyAnimator(duration: 0.6, curve: .linear)
    let distances: [CGFloat] = [-20.0, 20.0, -20.0, 20.0, -10.0, 10.0, -5.0, 5.0, 0.0 ]
    for (i, value) in distances.enumerated() {
        let delayFactor = Double(i) / Double(distances.count)
        animator.addAnimations({ [center, weak self] in
            self?.center = CGPoint(x: center.x   value, y: center.y)
        },
        delayFactor: CGFloat(delayFactor))
    }
    animator.addCompletion { _ in completion() }
    animator.startAnimation()
}
 

Ответ №1:

Анимации, добавленные с помощью этого addAnimations метода, выполняются вместе с любыми ранее настроенными анимациями (источник: Документация Apple). Таким образом, в вашем случае все ваши анимации пытаются отменить друг друга.

Если вы ищете анимацию, похожую на пружину, попробуйте инициализировать аниматора с помощью dampingRatio :

 myView.transform = CGAffineTransform(translationX: -20, y: 0)
let animator = UIViewPropertyAnimator(duration: 1.0, dampingRatio: 0.1) {
    self.myView.transform = .identity
}
animator.startAnimation()
 

Если это не совсем то, что вы ищете, вы можете использовать анимацию ключевых кадров.