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