這一篇主要介紹基礎動畫之縮放和旋轉。這些基本操作分享完之後,我想想可以找個稍微複雜一點點的動畫做做啦。
這篇繼續基礎篇,分享一下縮放和旋轉。因為整體思路和平移基本上沒有變化,加上原始碼裡面也有OC版本的。所以我們們這次以swift為例來寫一寫。
為了能夠更明顯的看到效果,所以加了幾個UILabel用來標示。實際開發中最好不要用我這種方法,就是偷個懶。用frame的時候還需要考慮螢幕適配問題,就有點麻煩了。
1. 思路和最終成果
最終的成果:
思維導圖:
2. 抽取公共方法
因為需要頻繁建立CALayer還有例項化動畫,所以不管在OC中還是Swift中都抽取一下公共的方法用來偷懶。哈哈~這就是本宅胖越來越發福的原因。
這裡使用了extension的方式,在程式碼少的時候看不出來優勢。程式碼多了有事就非常明顯了,最大的好處就是可以很容易快速定位到程式碼區域。
extension的作用之一就是可以很清晰的區分出各個func。
靜態擷取圖:是不是很清晰?
2.1 抽取建立CALayer的公共方法
// 建立calayer
fileprivate func createLayer (position: CGPoint, backgroundColor: UIColor) -> CALayer {
//建立calayer
let layer = CALayer()
//設定位置和大小
layer.position = position
layer.bounds = CGRect(x: 0, y: 0, width: 100, height: 100)
//設定背景顏色
layer.backgroundColor = backgroundColor.cgColor
//把layer新增到UIView的layer上
self.view.layer.addSublayer(layer)
return layer
}複製程式碼
2.2 抽取建立動畫的公共方法
這裡要把keyPath抽取出來的原因也是因為偷懶,因為不管是旋轉動畫還是縮放動畫,都需要使用這個屬性。所以抽取出來一個公共的方法,就可以兩種動畫共用一個啦。是不是懶到家了?
關於keyPath的欄位有啥作用,可以看看第三篇:iOS動畫系列之三:Core Animation。介紹了Core Animation的常用屬性和方法。
4.3 animationWithKeyPath中,常用的keyPath
這個裡面有詳細的說明。
程式碼如下:
//建立基礎Animation
fileprivate func createAnimation (keyPath: String, toValue: CGFloat) -> CABasicAnimation {
//建立動畫物件
let scaleAni = CABasicAnimation()
//設定動畫屬性
scaleAni.keyPath = keyPath
//設定動畫的起始位置。也就是動畫從哪裡到哪裡。不指定起點,預設就從positoin開始
scaleAni.toValue = toValue
//動畫持續時間
scaleAni.duration = 2;
//動畫重複次數
scaleAni.repeatCount = Float(CGFloat.greatestFiniteMagnitude)
return scaleAni;
}複製程式碼
3. 懶載入Layer
懶載入的目的是為了在View例項化的時候不進行建立,用的時候才進行建立。這樣可以一定程度上提高效率。
// 懶載入縮放的layer
private lazy var redLayer: CALayer = {
let layer = self.createLayer(position: CGPoint(x: 125, y: 150), backgroundColor: UIColor.red)
return layer
}()複製程式碼
4. 新增動畫
在這裡就能夠體現出來抽取公共方法的好處了吧。呼叫一下,傳幾個引數就好了。輕鬆,簡單,還有easy!
4.1 新增縮放動畫
// 新增縮放的動畫
redLayer.add(createAnimation(keyPath: "transform.scale.x", toValue: 0.5), forKey: nil)
blueLayer.add(createAnimation(keyPath: "transform.scale.y", toValue: 0.5), forKey: nil)
grayLayer.add(createAnimation(keyPath: "transform.scale.z", toValue: 0.5), forKey: nil)
greenLayer.add(createAnimation(keyPath: "transform.scale", toValue: 0.5), forKey: nil)複製程式碼
4.2 新增旋轉動畫
// 新增旋轉的動畫
redRotationLayer.add(createAnimation(keyPath: "transform.rotation.x", toValue: CGFloat(M_PI_4)), forKey: nil)
blueRotationLayer.add(createAnimation(keyPath: "transform.rotation.y", toValue: CGFloat(M_PI_4)), forKey: nil)
grayRotationLayer.add(createAnimation(keyPath: "transform.rotation.z", toValue: CGFloat(M_PI_4)), forKey: nil)複製程式碼
今天就到這裡啦,枯燥無味的CABasicAnimation基礎部分終於分享完了。下一篇可以嘗試使用CABasicAnimation做點好玩的東東。
喜歡的話就點個讚唄,或者賞俺點口糧。麼麼噠~愛你們~
OC和Swift的下載地址如下:
git.oschina.net/atypical/CA…
iOS實踐:CABasic-Animation(OC和Swift兩版)
-----------------------華麗分割線,iOS動畫系列全集連結-------------------------------------------------
第一篇:iOS動畫系列之一:通過實戰學習CALayer和透視的原理。做一個帶時分秒指標的時鐘動畫(上)
第二篇:iOS動畫系列之二:通過實戰學習CALayer和透視的原理。做一個帶時分秒指標的時鐘動畫。包含了OC和Swift兩種原始碼(下)
第三篇:iOS動畫系列之三:Core Animation。介紹了Core Animation的常用屬性和方法。
第四篇:CABasic Animation。iOS動畫系列之四:基礎動畫之平移篇
第五篇:CABasic Animation。iOS動畫系列之五:基礎動畫之縮放篇&旋轉篇
第六篇:iOS動畫系列之六:利用CABasic Animation完成帶動畫特效的登入介面
第七篇:iOS動畫系列之七:實現類似Twitter的啟動動畫
第八篇:iOS動畫系列之八:使用CAShapeLayer繪畫動態流量圖
第九篇:iOS動畫系列之九:實現點讚的動畫及播放起伏指示器
第十篇:實戰系列:繪製過山車場景