单击时查看抖动动画错误

WBu*_*uck 0 ios swift swift4

我一直在使用以下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")
}
Run Code Online (Sandbox Code Playgroud)

以及用法:

view.shake(count: 3, for: 0.2, withTranslation: 8)
Run Code Online (Sandbox Code Playgroud)

这适用于摇动视图(在我的情况下,我正在摇动一些按钮、UIView 和一些图像视图)。当我尝试在抖动动画期间单击其中一个视图时出现问题。

我收到:

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[NSConcreteValue doubleValue]:无法识别的选择器发送到实例 0x600000442640”

在按钮的情况下,如果我禁用按钮然后启动抖动动画,它似乎可以防止错误发生。不幸的是,这似乎不适用于图像视图和 UIViews。

我还禁用了图像视图/ UIView 上的用户交互,但无济于事。

我觉得这与在对视图进行动画处理时在命中测试检查期间将错误的坐标传递给较低层有关。

对此错误的任何见解将不胜感激。

小智 5

你可以试试这个代码。它应该有帮助:

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")
    }
}
Run Code Online (Sandbox Code Playgroud)