Я думаю, что все это опасно.
Если ваша анимация встряски основана на действии пользователя и что действие пользователя запускается во время анимации.
CRAAAAAASH
Вот мой способ в Swift 4:
static func shake(view: UIView, for duration: TimeInterval = 0.5, withTranslation translation: CGFloat = 10) {
let propertyAnimator = UIViewPropertyAnimator(duration: duration, dampingRatio: 0.3) {
view.transform = CGAffineTransform(translationX: translation, y: 0)
}
propertyAnimator.addAnimations({
view.transform = CGAffineTransform(translationX: 0, y: 0)
}, delayFactor: 0.2)
propertyAnimator.startAnimation()
}
Может быть, не самый чистый, но этот метод может быть многократно срабатывает и легко понятен