2015-11-17 2 views
1

Я использовал CABaseAnimation для создания анимации слоя и установите CABaseAnimation «s делегата viewController, вот код:CABaseAnimation Делегат

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") 
     } 
    } 

но в методе делегата я обнаружил, что консоль печатает три раза, а анимация заголовка слоя останавливается », вот строка печати на консоли:

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

Я очень смущен, почему метод печати выполняется три раза.

ответ

0

Ваш код говорит (по существу):

flyRight.delegate = self 
flyRight.setValue(heading.layer, forKey: "heading") 
heading.layer.addAnimation(flyRight, forKey: nil) 
username.layer.addAnimation(flyRight, forKey: nil) 
password.layer.addAnimation(flyRight, forKey: nil) 

Таким образом, вы добавляете эту анимацию в трех разных слоях. Прежде чем вы это сделаете, вы установили его "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:добавляет копию анимации. Это это то, чего некоторые люди не понимают. Но трудно понять, почему не понимая, что может вызвать ваше удивление в этой конкретной ситуации.)

+0

Спасибо, очень! Ключевой вопрос: addAnimation: forKey: добавляет копию анимации, – david

Смежные вопросы