我正在尝试实现一个动画以将 View 移动到我点击的位置。 每次点击都会取消之前的动画并从当前位置重新开始移动。
class MoveAnimationViewController: UIViewController {
lazy var block: UIView = {
let block = UIView()
block.frame = CGRect(x: 100, y: 100, width: 100, height: 100)
block.backgroundColor = UIColor.greenColor()
return block
}()
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(block)
view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "tap:"))
}
func tap(gesture: UITapGestureRecognizer) {
let fromPosition = (block.layer.presentationLayer() ?? block.layer).position
let toPostion = gesture.locationInView(view)
block.layer.removeAllAnimations()
let animation = CABasicAnimation(keyPath: "position")
animation.duration = 2
animation.fromValue = NSValue(CGPoint: fromPosition)
animation.toValue = NSValue(CGPoint: toPostion)
block.layer.addAnimation(animation, forKey: nil)
block.layer.position = toPostion
}
}
但是 block View 直接跳转到目的地,没有任何动画。
替换下面的代码
block.layer.addAnimation(animation, forKey: nil)
与
block.layer.addAnimation(animation, forKey: "move")
会解决问题,但为什么呢?
顺便说一下,下面的语句看起来是非法的,因为 presentationLayer
方法返回一个 AnyObject?
,它没有 position
属性。对吧?
let fromPosition = (block.layer.presentationLayer() ?? block.layer).position
我想应该用这个代替。但是编译器没有警告我。是错误吗?
let fromPosition = (block.layer.presentationLayer() as? CALayer ?? block.layer).position
最佳答案
如果您命名一个动画,即为其关联一个键,那么它将替换具有相同键的任何其他动画。如果您没有给它命名,则不会自动取消和替换。
关于iOS:为什么动画的关键很重要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32793982/