iOS:为什么动画的关键很重要?

标签 ios swift animation cabasicanimation

我正在尝试实现一个动画以将 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/

相关文章:

angularjs - 如何使用 AngularJS 为 div 高度变化设置动画

javascript - 使用 jquery.animate 多次调用后动画延迟

ios - CAShapeLayer 在动画 Swift 期间检测触摸

ios - 如何从 UIViewController 中删除传递的闭包

Swift 泛型参数不能绑定(bind)到非@objc 协议(protocol)

ios - 如何在 ios 中创建返回上一屏幕的后退按钮

java - 如果第二个动画开始,Gmail(如 Flip 动画)就会中断

ios - 使用 Geocoder 更新属性以获取用户实际地址,EXC_BAD_ACCESS

ios - 通过xamarin.ios中的内容调整UILabel高度

ios - 圆形 ImageView