Ios 卡巴斯基动画代理

Ios 卡巴斯基动画代理,ios,objective-c,delegates,core-animation,Ios,Objective C,Delegates,Core Animation,我使用CABaseAnimation创建层的动画,并将CABaseAnimation的委托设置为viewController,下面是代码: let flyRight = CABasicAnimation(keyPath: "position.x") flyRight.delegate = self flyRight.toValue = view.bounds.size.width/2 flyRight.fromValue = -view.bounds.size.width

我使用
CABaseAnimation
创建层的动画,并将
CABaseAnimation
的委托设置为
viewController
,下面是代码:

let flyRight = CABasicAnimation(keyPath: "position.x")
    flyRight.delegate = self
    flyRight.toValue = view.bounds.size.width/2
    flyRight.fromValue = -view.bounds.size.width/2
    flyRight.fillMode = kCAFillModeBoth
    flyRight.duration = 0.5

    flyRight.setValue(heading.layer, forKey: "heading")
    heading.layer.addAnimation(flyRight, forKey: nil)

    flyRight.beginTime = CACurrentMediaTime() + 0.3
    flyRight.setValue(username.layer, forKey: "username")
    username.layer.addAnimation(flyRight, forKey: nil)

    username.layer.position.x = view.bounds.size.width/2

    flyRight.beginTime = CACurrentMediaTime() + 0.4
    flyRight.setValue(password.layer, forKey: "password")
    password.layer.addAnimation(flyRight, forKey: nil)
    password.layer.position.x = view.bounds.size.width/2
代理
animationDidStop
方法代码如下:

 override func animationDidStop(anim: CAAnimation, finished flag: Bool) {
    print(anim)
    if let layer = anim.valueForKey("heading") as? CALayer {
        anim.setValue(nil, forKey: "heading")
        let animation = CABasicAnimation(keyPath: "transform.scale")
        animation.fromValue = 1.0
        animation.toValue = 1.5
        animation.duration = 1.0
        layer.addAnimation(animation, forKey: nil)
        print("heading layer animation did stop")
        }
    }
但在委托方法中,我发现控制台打印了三次“heading layer animation Dod stop”(标题层动画已停止),以下是控制台中的打印行:

<CABasicAnimation: 0x7fbe13096b10>
heading layer animation did stop
<CABasicAnimation: 0x7fbe13020bf0>
heading layer animation did stop
<CABasicAnimation: 0x7fbe13096c80>
heading layer animation did stop

标题层动画确实停止了
标题层动画确实停止了
标题层动画确实停止了
我很困惑为什么print方法执行了三次。

您的代码(本质上)说:

因此,将此动画添加到三个不同的层。在执行此操作之前,请将其
“heading”
键设置为
heading.layer
,并将动画的
委托设置为
self
。因此,我们有三个层运行一个动画,其中
delegate
self
,而
“heading”
键是
heading.layer

现在我们来看一下您的
animationDidStop
处理程序:

override func animationDidStop(anim: CAAnimation, finished flag: Bool) {
    if let layer = anim.valueForKey("heading") as? CALayer {
        print(/*...*/)
    }
}
因此,所有三个动画最后都调用
animationDidStop
处理程序,并且在所有三个动画中,
if let layer
测试通过;它们三个确实都有一个键
“heading”
,即CALayer。因此,所有三次都可以看到打印输出。很明显

(事实上,唯一不明显的是你为什么感到惊讶。我能想到的唯一解释是你没有意识到
addAnimation:forKey:
添加了一份动画副本。这是一些人没有意识到的。但很难理解为什么不意识到这一点会在这种特殊情况下引起你的惊讶on.)

您的代码(本质上)说:

因此,您将此动画添加到三个不同的层。在此之前,您将其
“heading”
键设置为
heading.layer
,并将动画的
delegate
设置为
self
。因此,我们有三个层运行动画,其中
delegate
self
,并且
“heading”
键是
heading.layer

现在我们来看一下您的
animationDidStop
处理程序:

override func animationDidStop(anim: CAAnimation, finished flag: Bool) {
    if let layer = anim.valueForKey("heading") as? CALayer {
        print(/*...*/)
    }
}
因此,所有三个动画最终都会调用
animationDidStop
处理程序,并且在所有三个动画中,
if let layer
测试通过;所有三个动画都确实有一个键
“heading”
,这是一个CALayer。因此,所有三次都会看到打印输出。这很明显


(事实上,唯一不明显的是你为什么感到惊讶。我能想到的唯一解释是你没有意识到
addAnimation:forKey:
添加了一份动画副本。这是一些人没有意识到的。但很难理解为什么不意识到这一点会在这种特殊情况下引起你的惊讶on.)

非常感谢!关键问题是addAnimation:forKey:添加动画副本,非常感谢!关键问题是addAnimation:forKey:添加动画副本,