2015-01-16 76 views
1

小规模动画按预期工作,但缩放动画恢复到正常大小确实有点奇怪;它将动画做到正常范围,但是它再次执行相同的动画,但速度更快。CABasicAnimation似乎执行两个动画

这里是我的代码:

func changeState(sender:UIButton){ 
     println(insideSolidLayer.animationKeys()) 
     if (shouldAnimate){ 
      shouldAnimate = false 
      if (on){ 
       animateSolidAway() 
      }else{ 
       animateSolidIn() 
      } 
      on = !on 
     } 
    } 

    func animateSolidAway(){ 
     insideSolidLayer.transform = CATransform3DMakeScale(1, 1, 1) 
     let scaleAnimate:CABasicAnimation = CABasicAnimation(keyPath: "transform.scale") 
     scaleAnimate.fromValue = 1 
     scaleAnimate.toValue = 0 
     scaleAnimate.duration = 0.2; 
     scaleAnimate.delegate = self 
     scaleAnimate.removedOnCompletion = false 
     scaleAnimate.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn) 
     insideSolidLayer.addAnimation(scaleAnimate, forKey: "scaleSmallAnimation") 

    } 

    func animateSolidIn(){ 
     insideSolidLayer.transform = CATransform3DMakeScale(0, 0, 0) 
     let scaleAnimate:CABasicAnimation = CABasicAnimation(keyPath: "transform.scale") 
     scaleAnimate.fromValue = 0 
     scaleAnimate.toValue = 1 
     scaleAnimate.duration = 3; 
     scaleAnimate.delegate = self 
     scaleAnimate.removedOnCompletion = false 
     scaleAnimate.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut) 
     insideSolidLayer.addAnimation(scaleAnimate, forKey: "scaleNormalAnimation") 
    } 

    override func animationDidStop(anim: CAAnimation!, finished flag: Bool) { 
     if(anim.isKindOfClass(CABasicAnimation)){ 
      if (insideSolidLayer != nil && insideSolidLayer.animationKeys() != nil && insideSolidLayer.animationKeys().count > 0){ 
       if contains(insideSolidLayer.animationKeys() as [String], "scaleSmallAnimation"){ 
        if (anim == insideSolidLayer.animationForKey("scaleSmallAnimation")){ 
         println("-animationDidStop- -scaleSmallAnimation-") 
         insideSolidLayer.transform = CATransform3DMakeScale(0, 0, 0) 
         shouldAnimate = true 
        } 
       } 

       if contains(insideSolidLayer.animationKeys() as [String], "scaleNormalAnimation"){ 
        if (anim == insideSolidLayer.animationForKey("scaleNormalAnimation")){ 
         println("-animationDidStop- -scaleNormalAnimation-") 
         insideSolidLayer.transform = CATransform3DMakeScale(1, 1, 1) 
         shouldAnimate = true 

        } 
       } 
      } 
     } 
    } 

回答

3

发现了问题:

func animateSolidAway(){ 

     let scaleAnimate:CABasicAnimation = CABasicAnimation(keyPath: "transform.scale") 
     scaleAnimate.fromValue = 1 
     scaleAnimate.toValue = 0 
     scaleAnimate.duration = 0 
     scaleAnimate.delegate = self 
     scaleAnimate.removedOnCompletion = false 
     scaleAnimate.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn) 
     insideSolidLayer.addAnimation(scaleAnimate, forKey: "scaleSmallAnimation") 


    } 

    func animateSolidIn(){ 
     insideSolidLayer.transform = CATransform3DMakeScale(1, 1, 1) 
     let scaleAnimate:CABasicAnimation = CABasicAnimation(keyPath: "transform.scale") 
     scaleAnimate.fromValue = 0 
     scaleAnimate.toValue = 1 
     scaleAnimate.duration = 0 
     scaleAnimate.delegate = self 
     scaleAnimate.removedOnCompletion = false 
     scaleAnimate.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut) 
     insideSolidLayer.addAnimation(scaleAnimate, forKey: "scaleNormalAnimation") 
    }