Просмотр ошибки анимации встряхивания при нажатии - PullRequest
0 голосов
/ 28 апреля 2018

Я использовал следующее расширение 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 безрезультатно.

Мне кажется, что это как-то связано с неправильной передачей координат нижним слоям во время проверки теста попадания во время анимации представления.

Любое понимание этой ошибки будет с благодарностью.

1 Ответ

0 голосов
/ 28 апреля 2018

Вы можете попробовать этот код. Это должно быть полезно:

extension UIView {

    func shakeByX() {
        let animation = CABasicAnimation(keyPath: "position")
        animation.duration = 0.07
        animation.repeatCount = 3
        animation.autoreverses = true
        animation.fromValue = NSValue(cgPoint: CGPoint(x: self.center.x - 6, y: self.center.y))
        animation.toValue = NSValue(cgPoint: CGPoint(x: self.center.x + 6, y: self.center.y))
        self.layer.add(animation, forKey: "position")
    }

    func shakeByY() {
        let animation = CABasicAnimation(keyPath: "position")
        animation.duration = 0.07
        animation.repeatCount = 3
        animation.autoreverses = true
        animation.fromValue = NSValue(cgPoint: CGPoint(x: self.center.x, y: self.center.y - 6))
        animation.toValue = NSValue(cgPoint: CGPoint(x: self.center.x, y: self.center.y + 6))
        self.layer.add(animation, forKey: "position")
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...