2015-09-26 22 views
0

我试图实现一个动画来将视图移动到我点击的位置。 每次敲击都会取消先前的动画,并从当前位置开始再次移动。iOS:为什么动画的关键很重要?

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.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 
+0

你为什么使用表示层?为什么不直接动画视图? – Sulthan

+0

@Sulthan我想要的是将视图移动到我点击的位置,如果在它到达那里之前点击另一个地方,视图应该停止以前的移动并从其位置开始新移动。 (我希望我已经说清楚了)。我尝试了UIView.animateWithDuration方法,但运动看起来很奇怪,所以我必须改用层动画。 –

回答

2

如果你命名的动画,也就是它的主要关联,那么它会替代任何其他动画使用相同的密钥。如果您没有提供自动取消和替换的名称,则不会发生。

+0

我认为block.layer.removeAllAnimations()会取消所有的动画,不是吗? –

相关问题