1. 概述
上文簡單講述了CALayer的概念以及一些屬性,針對于Layer,除了其展示樣式,我們更注重它的影片,本篇文章及本專欄的后續文章將圍繞Layer的核心影片進行探究,
本文首先看一下CALayer的基礎影片類CABasicAnimation以及CATransaction的使用,
2. CALayer基礎影片
CALayer基礎影片類為CABasicAnimation,看一下官方的定義:
An object that provides basic, single-keyframe animation capabilities for a layer property.
一個能夠給Layer提供基礎的單個關鍵幀影片能力的物件,
2.1 常用屬性及方法
常用方法及屬性見下表:
| 屬性及方法 | 型別 | 說明 |
|---|---|---|
init(keyPath: String?) | / | 初始化方法 |
fromValue | Any? | 影片執行初始值 |
toValue | Any? | 影片執行結束值 |
byValue | Any? | 影片執行的結束值與初始值的差值 |
keyPath | String? | 指定執行影片的key path |
isRemovedOnCompletion | Bool | 影片執行結束后是否從目標圖層中移除,設定為false解決影片恢復到初始位置的問題, |
fillMode | CAMediaTimingFillMode | removed:默認值,影片開始前和結束后,影片對圖層都沒有影響,圖層依然保持初始值, forwards:影片結束后保持最終的可見狀態, backwards:影片開始前,只要加入影片,圖層就會處于影片的初始狀態,即第一幀影片, both:綜合了forwards和backwards兩種功能,影片加入圖層到真正執行影片的時間段里,圖層保持影片初始狀態;影片結束之后保持影片最終狀態 |
duration | CFTimeInterval | 影片執行時長 |
repeatCount | Float | 影片執行次數 |
repeatDuration | CFTimeInterval | 影片多久后執行一次, |
創建影片的時候可通過init(keyPath: String?)方法實體化一個物件,并指定一個屬性的keyPath用于影片,
可以將一個標量屬性(有具體的數值)添加影片,比如不同明度(opacity),將其值從0設定到1,代碼如下:
override func viewDidLoad() {
super.viewDidLoad()
layer.frame = CGRect(x: 20, y: 60, width: 100, height: 100)
layer.backgroundColor = UIColor.red.cgColor
self.view.layer.addSublayer(layer)
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
let animation = CABasicAnimation(keyPath: "opacity")
animation.fromValue = 0
animation.toValue = 1
animation.duration = 2
animation.isRemovedOnCompletion = false
animation.fillMode = .forwards
layer.add(animation, forKey: nil)
}
上面創建了一個紅色的layer,并將其添加到了當前view的layer中,當點擊螢屏的時候,修改紅色layer的opacity,
一些非標量屬性,比如背景色(backgroundColor),其值變化也可以加入影片,代碼如下,重復代碼不在提現:
let animation = CABasicAnimation(keyPath: "backgroundColor")
animation.fromValue = UIColor.red.cgColor
animation.toValue = UIColor.blue.cgColor
還給可給一些多值的屬性添加影片,比如位置資訊(position),代碼如下:
let animation = CABasicAnimation(keyPath: "position")
animation.fromValue = [0, 0]
animation.toValue = [100, 100]
除了以上,還可以給某個屬性的里面的某個值添加影片,例如:
let animation = CABasicAnimation(keyPath: "transform.scale.x")
animation.fromValue = 1
animation.toValue = 2
2.2 常用Key Paths
以上便是一些基礎影片的創建,至于哪些keyPath可以執行影片,具體如下:
CATransform3D Key Paths
| Key Path | Description |
|---|---|
| transform. | 設定一個沿著x軸旋轉的弧度值, 關于π,Swift 3.0以后請使用Doubl.pi |
| transform. | 設定一個沿著y軸旋轉的弧度值, |
| transform. | 設定一個沿著z軸旋轉的弧度值, |
| transform. | 設定一個沿著z軸旋轉的弧度值,同transform. |
| transform. | 設定一個沿著x軸放縮的比例因子, |
| transform. | 設定一個沿著y軸放縮的比例因子, |
| transform. | 設定一個沿著z軸放縮的比例因子, |
| transform. | 設定一個整體放縮的比例因子, |
| transform. | 設定一個沿著x軸移動的值, |
| transform. | 設定一個沿著y軸移動的值, |
| transform. | 設定一個沿著z軸移動的值, |
| transform.translation | 設定一個結構體型別的值,例如CGSize,CGPoint,其值表示沿著x軸和y軸移動的數值, |
CGPoint Key Paths
| Key Path | Description |
|---|---|
| position. | 設定一個中心點沿著x軸移動的值, |
| position. | 設定一個中心點沿著y軸移動的值, |
CGSize Key Paths
| Key Path | Description |
|---|---|
|
| 設定一個寬度變換的值, |
|
| 設定一個高度變換的值, |
3. CATransaction
CATransaction是將Layer tree多個操作批處理為渲染樹的原子更新的核心影片機制,對Layer tree的每個修改都必須是CATransaction的一部分,支持嵌套CATransaction,
Core Animation支持兩種型別的CATransaction:implicit transactions(隱式)和explicit transactions(顯式),
implicit transactions在沒有活動transactions的執行緒修改layer tree的時候自動創建,并在執行緒runloop下一次迭代的時候自動提交,
explicit transactions則是在修改layer tree之前向CATransaction類發送begin()訊息,修改后發送commit()訊息時時候觸發,
常用類方法如下表:
| 類方法 | 說明 |
|---|---|
class func begin() | 在當前執行緒創建一個transaction, |
class func commit() | 提交當前transaction的所有修改, |
class func flush() | 重繪任何存在的隱式transaction. |
class func animationDuration() -> CFTimeInterval | 回傳在transaction組中所有影片的執行時間, |
class func setAnimationDuration(CFTimeInterval) | 設定transaction組中所有影片的執行時間, |
class func completionBlock() -> (() -> Void)? | 回傳影片結束后的block物件, |
class func setCompletionBlock((() -> Void)?) | 設定影片結束后的block物件, |
關于隱式影片,我們不需要添加額外的代碼,系統會自己處理,比如在改變backgroundColor的時候,顏色會從一個到另一個顏色漸變過去,系統的影片時間為0.25秒,
至于顯示影片,則需要我們手動添加代碼了,
先看一段簡單的代碼,將一個Layer的的size變成原來的兩倍,并改變其背景色,
func transactionAnimation() {
CATransaction.begin()
let transform = CATransform3DScale(layer.transform, 2, 2, 2)
layer.transform = transform
CATransaction.setAnimationDuration(2)
CATransaction.setCompletionBlock {
self.layer.backgroundColor = UIColor.blue.cgColor
}
CATransaction.commit()
}
下面看一個顯示的嵌套CATransaction,Layer從不透明到透明,然后移除,期間size變為原來的3倍,
func transactionNestedAnimation() {
// Outer transaction animates `opacity` to 0 over 2 seconds
CATransaction.begin()
CATransaction.setAnimationDuration(2)
layer.opacity = 0
CATransaction.setCompletionBlock {
self.layer.removeFromSuperlayer()
}
// Inner transaction animates scale to (3, 3, 3) over 1 second
CATransaction.begin()
CATransaction.setAnimationDuration(2)
layer.transform = CATransform3DMakeScale(3, 3, 3)
CATransaction.commit() // Commits inner transaction
CATransaction.commit() // Commits outer transaction
}
4. 總結
本文主要講述了CABasicAnimation以及CATransaction兩種影片,作為基礎影片,用起來并不難,文中也列舉了常用的一些方法和屬性等,
文中如有不正確的地方,還請路過的朋友指正,
本篇文章出自https://blog.csdn.net/guoyongming925的博客,如需轉載,請標明出處,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/234933.html
標籤:其他
上一篇:第一行代碼——第七章(跨程式共享資料-探究內容提供器(程式運行時申請權限)) F8-59-71-6E-8A-52 2024
