【问题标题】:iOS: Why does the key of animation matter?iOS:为什么动画的关键很重要?
【发布时间】: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


【解决方案1】:

如果您为动画命名,即为其关联一个键,那么它将替换具有相同键的任何其他动画。如果你不给它命名,那么自动取消和替换就不会发生。

【讨论】:

  • 我认为 block.layer.removeAllAnimations() 会取消所有动画,不是吗?
猜你喜欢
  • 2013-05-18
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 2014-02-09
  • 2013-01-12
  • 1970-01-01
相关资源
最近更新 更多