【发布时间】:2015-09-26 05:30:28
【问题描述】:
我正在尝试实现动画以将视图移动到我点击的位置。 每次点击都会取消之前的动画并从当前位置重新开始移动。
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
应该换成这个吧,我猜。但是编译器没有警告我。是bug吗?
let fromPosition = (block.layer.presentationLayer() as? CALayer ?? block.layer).position
【问题讨论】:
-
你为什么使用表示层?为什么不直接为视图设置动画?
-
@Sulthan 我想要的是将视图移动到我点击的位置,如果我在它到达那里之前点击另一个地方,视图应该停止之前的移动并从它所在的位置开始一个新的移动. (我希望我已经说清楚了)。我尝试了 UIView.animateWithDuration 方法,但动作看起来很奇怪,所以我必须使用图层动画。
标签: ios swift animation cabasicanimation