2016-01-13 23 views
0

我正在嘗試旋轉並移動和縮放字母。類似於本視頻,但帶有UILabels(每個標籤一個字母) https://www.youtube.com/watch?v=rwE6tAQPFuY&feature=youtu.be使用UILabel字母實現旋轉,移動,縮放動畫效果。 Swift

一個360度旋轉,平移運動和一個縮放到同一時間的正常大小。

我管理通過執行以下操作

UIView.animateWithDuration(0.5,延遲,以實現與正常的UIImageView這種效果:0,選擇:UIViewAnimationOptions.CurveLinear,動畫: { image.frame = CGRectMake(middlePosX ,middlePosY,imageWidth *(1 + ranScale)/ 2,imageHeight *(1 + ranScale)/ 2) image.transform = CGAffineTransformRotate(letterImage.transform,CGFloat的(M_PI))

 }, completion: 
     { _ in 
      UIView.animateWithDuration(0.5, delay: 0, options: UIViewAnimationOptions.CurveLinear, animations: 
       { 

        image.frame = CGRectMake(finalPosX, finalPosY, imageWidth, imageHeight) 
        image.transform = CGAffineTransformRotate(letterImage.transform, CGFloat(M_PI)) 
       }, 
       completion: nil) 

    }) 

然而當使用UILabels該框架沒有重置文本的大小。所以,我試圖初始變換,然後是本

letterImage.transform = CGAffineTransformScale(letterImage.transform, ranScale, ranScale) 

UIView.animateWithDuration(0.5,延遲:0,選擇:UIViewAnimationOptions.CurveLinear,動畫: {

 letterImage.frame = CGRectMake(middlePosX, middlePosY, imageWidth, imageHeight) 

     var rotateTransform = CGAffineTransformMakeRotation(CGFloat(M_PI)) 
     var scaleTransform = CGAffineTransformMakeScale((1 + ranScale)/2, (1 + ranScale)/2) 
     letterImage.transform = CGAffineTransformConcat(rotateTransform, scaleTransform) 

    }, completion: 
    { _ in 
     UIView.animateWithDuration(0.5, delay: 0, options: UIViewAnimationOptions.CurveLinear, animations: 
     { 

      letterImage.frame = CGRectMake(finalPosX, finalPosY, imageWidth, imageHeight) 
      letterImage.transform = CGAffineTransformIdentity 
     }, 
     completion: nil) 

    }) 

,但它不達到效果我想..當我將旋轉與運動相結合時,它以不同的方式旋轉,然後在上一次和結束時,有時它甚至會發生一次異常跳躍。 看起來像這樣 https://www.youtube.com/watch?v=CaD1BTwN8Yg&feature=youtu.be

如何使用UILabel字母達到所需的效果?

回答

0

這似乎是個伎倆。 4種不同的CABasicAnimations

let scaleAnimation = CABasicAnimation(keyPath: "transform.scale") 
    scaleAnimation.fromValue = ranScale 
    scaleAnimation.toValue = 1 
    scaleAnimation.duration = 1 
    textLayer.addAnimation(scaleAnimation, forKey: "transform.scale") 


    let rotateAnimation = CABasicAnimation(keyPath: "transform.rotation.z") 

    rotateAnimation.fromValue = 2 * M_PI 
    rotateAnimation.toValue = 0 
    rotateAnimation.duration = 1 
    textLayer.addAnimation(rotateAnimation, forKey: "transform.rotation.z") 

    let moveXAnimation = CABasicAnimation(keyPath: "position.x") 
    moveXAnimation.fromValue = ranX 
    moveXAnimation.toValue = textLayer.position.x 
    moveXAnimation.duration = 1 
    textLayer.addAnimation(moveXAnimation, forKey: "position.x") 


    let moveYAnimation = CABasicAnimation(keyPath: "position.y") 
    moveYAnimation.fromValue = ranY 
    moveYAnimation.toValue = textLayer.position.y 
    moveYAnimation.duration = 1 
    textLayer.addAnimation(moveYAnimation, forKey: "position.y")