通過設置視圖的transform屬性實現動畫(效率低,簡單)
CABasicAnimation實現動畫(高效)
CAKeyframeAnimation實現動畫(根據路徑實現幀動畫)
一、transform
設置視圖對象的transform屬性,可以實現各種動畫效果。
1,移動
指在同一平面內,將控件按照某個直線方向平移一定的距離。
//每次都從當前位置平移
self.imageView.transform = CGAffineTransformTranslate(self.imageView.transform, -2.1, -2.1)
//每次都從最開始的位置計算平移
self.imageView.transform = CGAffineTransformMakeTranslation(2.3, 2.3)
2,旋轉
//連續旋轉
UIView.beginAnimations(nil, context: nil)
UIView.setAnimationDuration(3.0) //設置動畫時間
self.imageView.transform = CGAffineTransformRotate(self.imageView.transform, CGFloat(-M_PI/2))
UIView.commitAnimations()
//獨立旋轉,以初始位置旋轉
self.imageView.transform = CGAffineTransformMakeRotation(CGFloat(-M_PI/4))
3,縮放
//連續縮放
UIView.beginAnimations(nil, context: nil)
UIView.setAnimationDuration(3.0) //設置動畫時間
self.imageView.transform = CGAffineTransformScale(self.imageView.transform, 1.5 ,1.5)
UIView.commitAnimations()
//獨立縮放,以初始位置縮放
self.imageView.transform = CGAffineTransformMakeScale(1.3, 1.3)
4,反轉
//返回初始狀態
self.imageView.transform = CGAffineTransformIdentity
//連續反轉
UIView.beginAnimations(nil, context: nil)
UIView.setAnimationDuration(3.0) //設置動畫時間
self.imageView.transform = CGAffineTransformConcat(self.imageView.transform,
CGAffineTransformInvert(self.imageView.transform))
UIView.commitAnimations()
//獨立反轉,以初始位置反轉
self.imageView.transform = CGAffineTransformInvert(self.imageView.transform)
二、CABasicAnimation
CABasicAnimation
類只有三個屬性:
fromValue:開始值
toValue:結束值
Duration:動畫的時間通過
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使用樣例
(1)改變透明度動畫(逐漸消失)
let animation = CABasicAnimation(keyPath: "opacity")
animation.fromValue = 1.0
animation.toValue = 0.0
animation.duration = 3.0
self.imageView.layer.addAnimation(animation, forKey: "Image-opacity")
self.imageView.alpha = 0
(2)從小變大動畫(還原為默認尺寸)
let animation = CABasicAnimation(keyPath: "bounds.size")
animation.fromValue = NSValue(CGSize: CGSizeMake(2.0, 2.0))
animation.toValue = NSValue(CGSize: self.imageView.frame.size)
animation.duration = 3.0
self.imageView.layer.addAnimation(animation, forKey: "Image-expend")
三、CAKeyframeAnimation
CAKeyframeAnimation介紹
CAKeyframeAnimation可以實現關鍵幀動畫,這個類可以實現某一屬性按照一串的數值進行動畫,就像是一幀一幀的制作出來一樣。使用樣例(設置五個關鍵點坐標,圖片依次按關鍵點移動)
let animation = CAKeyframeAnimation(keyPath: "position")
//設置5個位置點
let p1 = CGPointMake(0.0, 0.0)
let p2 = CGPointMake(300, 0.0)
let p3 = CGPointMake(0.0, 400)
let p4 = CGPointMake(300, 400)
let p5 = CGPointMake(150, 200)
//賦值
animation.values = [NSValue(CGPoint: p1), NSValue(CGPoint: p2),
NSValue(CGPoint: p3), NSValue(CGPoint: p4), NSValue(CGPoint: p5)]
//每個動作的時間百分比
animation.keyTimes = [NSNumber(float: 0.0), NSNumber(float: 0.4),
NSNumber(float: 0.6), NSNumber(float: 0.8), NSNumber(float: 1.0), ]
animation.delegate = self
animation.duration = 6.0
self.imageView.layer.addAnimation(animation, forKey: "Image-Move")
可以設置動畫代理,監聽開始和結束動作
animation.delegate = self
override func animationDidStart(anim: CAAnimation!) {
println("動畫開始")
}
override func animationDidStop(anim: CAAnimation!, finished flag: Bool) {
println("動畫結束")
}