Я использовал следующее расширение UIView
, чтобы потрясти вид:
func shake(count: Float = 4, for duration: TimeInterval = 0.5,
withTranslation translation: CGFloat = 5) {
let animation: CABasicAnimation = CABasicAnimation(keyPath: "transform.translation.x")
animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)
animation.repeatCount = count
animation.duration = duration / TimeInterval(animation.repeatCount)
animation.autoreverses = true
animation.fromValue = NSValue(cgPoint: CGPoint(x: -translation, y: self.center.y))
animation.toValue = NSValue(cgPoint: CGPoint(x: translation, y: self.center.y))
layer.add(animation, forKey: "shake")
}
И использование:
view.shake(count: 3, for: 0.2, withTranslation: 8)
Это хорошо работает для встряхивания вида (в моем случае я трясу некоторые кнопки, UIView и несколько представлений изображений).
Проблема возникает, когда я пытаюсь нажать на одно из представлений во время анимации встряхивания.
Я получаю:
Завершение приложения из-за необработанного исключения
'NSInvalidArgumentException', причина: '- [NSConcreteValue doubleValue]:
нераспознанный селектор отправлен на экземпляр 0x600000442640 '
В случае кнопок, если я отключаю кнопку, то запускаю анимацию встряхивания, которая, как представляется, предотвращает возникновение ошибки.
К сожалению, это не работает для представлений изображений и UIViews.
Я также отключил взаимодействие с пользователем при просмотре изображений / UIView безрезультатно.
Мне кажется, что это как-то связано с неправильной передачей координат нижним слоям во время проверки теста попадания во время анимации представления.
Любое понимание этой ошибки будет с благодарностью.