使用 CABasicAnimation 移动时无法使用 UIButton

Posted

技术标签:

【中文标题】使用 CABasicAnimation 移动时无法使用 UIButton【英文标题】:Cannot use UIButton when using CABasicAnimation to move it 【发布时间】:2020-02-12 00:10:11 【问题描述】:

我正在尝试为 UIButton 设置动画,使其在屏幕上四处移动,但是一旦设置动画,当我尝试将它实际用作按钮时它会崩溃。

这是不允许的吗?如何做到这一点?

我尝试将按钮放在 UIView 中,然后改为动画视图 - 仍然崩溃。

    @IBOutlet weak var button: UIButton!

    override func viewDidLoad() 
        super.viewDidLoad()

        CATransaction.begin()

        let animation = CABasicAnimation(keyPath: "position")
        animation.fromValue = [view.layer.frame.width, 200]
        animation.toValue = [0, 200]
        animation.duration = 25.0
        animation.repeatCount = .greatestFiniteMagnitude

        button.layer.add(animation, forKey: "animatePosition")

        CATransaction.commit()
    

尝试单击按钮时会引发以下异常:

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

【问题讨论】:

尝试使用传递 CGPoint 而不是数组。确保您的 IBAction 正确连接到您的按钮。 @LeoDabus 谢谢,我试过了,但它仍然崩溃:animation.fromValue = CGPoint(x: view.layer.frame.width, y: 200.0) animation.toValue = CGPoint(x: 0 , y: 200.0) 我认为您的问题在于您的按钮连接。编辑您的问题并发布按下按钮时应调用的 IBAction。此外,您应该提供您的错误发生在哪一行。 【参考方案1】:

您正在分配两个数值的数组,而不是预期的位置类型。 CABasicAnimation 期望的值的类型是NSValue(cgPoint:)

您将通过以下方式修复该崩溃:

animation.fromValue = NSValue(cgPoint: CGPoint(x: view.layer.frame.width, y: 200.0))
animation.toValue = NSValue(cgPoint: CGPoint(x: 0, y: 200))

【讨论】:

谢谢,所以我尝试了你和@Leo 的建议,但它仍然崩溃 animation.fromValue = CGPoint(x: view.layer.frame.width, y: 200.0) animation.toValue = CGPoint (x: 0, y: 200.0) 更改为NSValue后的崩溃日志是什么? *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[__NSArrayI pointValue]:无法识别的选择器发送到实例 0x283c16620” 添加All Exceptions 断点并检查调试器停止的行。 learnappmaking.com/wp-content/uploads/2017/05/… 不确定它是否重要,但是一旦动画完成并且按钮再次出现 - 如果您单击它,它仍然会崩溃。 (当然,如果我取消动画它不会崩溃)

以上是关于使用 CABasicAnimation 移动时无法使用 UIButton的主要内容,如果未能解决你的问题,请参考以下文章

CABasicAnimation的基本使用方法(移动·旋转·放大·缩小)

如何使用 CABasicAnimation 从一个点移动到另一个点?

如何使用 CABasicAnimation 水平移动球并将球停在正确的位置

如何在动画 CABasicAnimation 时改变速度

如何在动画CABasicAnimation时改变速度

CABasicAnimation 圆圈 CAShapeLayer 在地图上移动而不是缩放