天天看點

swift中的動畫

UIView的通用動畫

let view = UIView(frame: CGRectMake(, , , ))
self.view.addSubview(view)
view.backgroundColor = UIColor.lightGrayColor()
// 位置改變
var frame = view.frame
UIView.animateWithDuration(, delay: , options: UIViewAnimationOptions.CurveEaseInOut, animations: {
            () -> Void in

            frame.origin.x = 
            view.frame = frame

            }) {
                (finished:Bool) -> Void in

                UIView.animateWithDuration() {
                    () -> Void in

                    frame.origin.x = 
                    view.frame = frame
                }
}
           

CABasicAnimation核心動畫

1、CABasicAnimation類隻有三個屬性:

fromValue:開始值

toValue:結束值

Duration:動畫的時間

repeatCount:重複次數

2、通過animationWithKeyPath鍵值對的方式設定不同的動畫效果

transform.scale

transform.scale.x

transform.scale.y

transform.rotation.z

opacity

margin

zPosition

backgroundColor

cornerRadius

borderWidth

bounds

contents

contentsRect

cornerRadius

frame

hidden

mask

masksToBounds

opacity

position

shadowColor

shadowOffset

shadowOpacity

shadowRadius

let view = UILabel(frame: CGRectMake((self.view.frame.size.width - ) / , , , ))
self.view.addSubview(view)
view.text = "縮放/淡入淡出"
view.textAlignment = .Center
view.adjustsFontSizeToFitWidth = true
view.backgroundColor = UIColor.lightGrayColor()
//
let layer = view.layer
// 開始動畫
// 縮放
let scaleAnimate = CABasicAnimation(keyPath: "transform.scale")
scaleAnimate.fromValue = 
scaleAnimate.toValue = 
scaleAnimate.autoreverses = true
scaleAnimate.repeatCount = MAXFLOAT
scaleAnimate.duration = 
// 淡入淡出
let opaqueAnimate = CABasicAnimation(keyPath: "opacity")
opaqueAnimate.fromValue = 
opaqueAnimate.toValue = 
opaqueAnimate.autoreverses = true
opaqueAnimate.repeatCount = MAXFLOAT
opaqueAnimate.duration = 
layer.addAnimation(scaleAnimate, forKey: "scaleAnimate")
layer.addAnimation(opaqueAnimate, forKey: "opacityAnimate")
           
// 組合動畫
let view3 = UILabel(frame: CGRectMake(, (currentView.frame.origin.y + currentView.frame.size.height + ), , ))
self.view.addSubview(view3)
view3.text = "組合動畫"
view3.textAlignment = .Center
view3.adjustsFontSizeToFitWidth = true
view3.backgroundColor = UIColor.lightGrayColor()
//
let layer3 = view3.layer
// CAAnimationGroup組合動畫效果
let rotate: CABasicAnimation = CABasicAnimation()
rotate.keyPath = "tranform.rotation"
rotate.toValue = M_PI
let scale: CABasicAnimation = CABasicAnimation()
scale.keyPath = "transform.scale"
scale.toValue = 
let move: CABasicAnimation = CABasicAnimation()
move.keyPath = "transform.translation"
move.toValue = NSValue(CGPoint: CGPoint(x: , y: ))
let animationGroup:CAAnimationGroup = CAAnimationGroup()
animationGroup.animations = [rotate, scale, move]
animationGroup.duration = 
animationGroup.fillMode = kCAFillModeForwards
animationGroup.removedOnCompletion = false
animationGroup.repeatCount = MAXFLOAT
//
layer3.addAnimation(animationGroup, forKey: nil)
           

CAKeyframeAnimation關鍵幀動畫

主要屬性:

keyPath : 要設定的屬性

path : 路徑 可用UIBezierPath(設定了path,将忽略values)

duration : 動畫時長

repeatCount : 重複次數

calculationMode : 動畫計算方式

values:每一個關鍵幀(設定了path,将忽略values)

removedOnCompletion:執行完之後不删除動畫

fillMode:執行完之後儲存最新的狀态

delegate:代理

let view = UILabel(frame: CGRectMake((self.view.frame.size.width - ) / , , , ))
self.view.addSubview(view)
view.text = "CAKeyframeAnimation動畫"
view.backgroundColor = UIColor.lightGrayColor()
//
let layer = view.layer
// 位移
let keyAnimate = CAKeyframeAnimation(keyPath: "position")
// 設定關鍵幀
let value0 = NSValue(CGPoint: layer.position)
let value1 = NSValue(CGPoint: CGPointMake(layer.position.x, layer.position.y + ))
let value2 = NSValue(CGPoint: CGPointMake(layer.position.x - , layer.position.y + ))
let value3 = NSValue(CGPoint: CGPointMake(layer.position.x - , layer.position.y))
let value4 = NSValue(CGPoint: layer.position)
// 速度曲線
let tf0 = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
let tf1 = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)
let tf2 = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn)
let tf3 = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut)
keyAnimate.timingFunctions = [tf0, tf1, tf2, tf3]
// 每段執行的時間
keyAnimate.keyTimes = [, , , , ]
//
keyAnimate.values = [value0, value1, value2, value3, value4]
keyAnimate.autoreverses = false
keyAnimate.repeatCount = 
keyAnimate.duration = 
//
keyAnimate.delegate = self
//
layer.addAnimation(keyAnimate, forKey: "position")
           
// 代理方法
override func animationDidStart(anim: CAAnimation) {
        print("開始")
}

override func animationDidStop(anim: CAAnimation, finished flag: Bool) {
        print("結束")
}
           
let view3 = UILabel(frame: CGRectMake(, (currentView.frame.origin.y + currentView.frame.size.height + ), , ))
self.view.addSubview(view3)
view3.text = "抖動"
view3.backgroundColor = UIColor.lightGrayColor()
//
let layer3 = view3.layer
// 抖動
let animation3 = CAKeyframeAnimation()
animation3.keyPath = "transform.rotation"
// (-M_PI_4 / * )表示-度 。
let value31 = NSValue(CGPoint: CGPointMake(CGFloat(-M_PI_4 /  * ), ))
let value32 = NSValue(CGPoint: CGPointMake(CGFloat(M_PI_4 /  * ), ))
let value33 = NSValue(CGPoint: CGPointMake(CGFloat(-M_PI_4 /  * ), ))
animation3.values = [value31, value32, value33];
animation3.removedOnCompletion = false
animation3.fillMode = kCAFillModeForwards
animation3.duration = 
animation3.repeatCount = MAXFLOAT
//
layer3.addAnimation(animation3, forKey: nil)
           

繼續閱讀