使用 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 从一个点移动到另一个点?