Core Animation系列之CATransaction

CATransaction是 Core Animation 中的事務類,在iOS中的圖層中,圖層的每個改變都是事務的一部分,CATransaction可以對多個layer的屬性同時進行修改,同時負責成批的把多個圖層樹的修改作為一個原子更新到渲染樹。

/* CoreAnimation - CATransaction.h

   Copyright (c) 2006-2016, Apple Inc.
   All rights reserved. */`

/* Transactions are CoreAnimation's mechanism for batching multiple layer-
 * tree operations into atomic updates to the render tree. Every
 * modification to the layer tree requires a transaction to be part of.
 *
 * CoreAnimation supports two kinds of transactions, "explicit" transactions
 * and "implicit" transactions.
 *
 * Explicit transactions are where the programmer calls `[CATransaction
 * begin]' before modifying the layer tree, and `[CATransaction commit]'
 * afterwards.
 *
 * Implicit transactions are created automatically by CoreAnimation when the
 * layer tree is modified by a thread without an active transaction.
 * They are committed automatically when the thread's run-loop next
 * iterates. In some circumstances (i.e. no run-loop, or the run-loop
 * is blocked) it may be necessary to use explicit transactions to get
 * timely render tree updates. */

@available(iOS 2.0, *)
open class CATransaction : NSObject

CATransaction事務類分為隱式事務和顯式事務,注意以下兩組概念的區分:
1.隱式動畫和隱式事務:
隱式動畫通過隱式事務實現動畫 。
2.顯式動畫和顯式事務:
顯式動畫有多種實現方式,顯式事務是一種實現顯式動畫的方式。

一、隱式事務
除顯式事務外,任何對于CALayer屬性的修改,都是隱式事務.這樣的事務會在run-loop中被提交.
當圖層樹被沒有獲得事務的線程修改的時候將會自動創建隱式事務,當線程的運行循環(run-loop)執行下次迭代的時候將會自動提交事務。 但是,當在同一個運行循環(runloop)的線程修改圖層的屬性時,你必須使用顯式事務。以下皆是隱式事務。

override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        layer = CALayer()
        layer.bounds = CGRect(x: 0, y: 0, width: 100, height: 100)
        layer.position = CGPoint.init(x: 150, y: 100)
        layer.backgroundColor = UIColor.red.cgColor
        layer.borderColor = UIColor.black.cgColor
        layer.opacity = 1.0
        self.view.layer.addSublayer(layer)
    }

可以通過下面的方法查看動畫的效果,前提是讓動畫效果出來:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesBegan(touches, with: event)
        
        // 設置變化動畫過程是否顯示,默認為true不顯示
        CATransaction.setDisableActions(false)
        // 設置圓角
        layer.cornerRadius = (layer.cornerRadius == 0.0) ? 30.0 : 0.0
        // 設置透明度
        layer.opacity = (layer.opacity == 1.0) ? 0.5 : 1.0
    }

二、顯式事務
在你修改圖層樹之前,可以通過給 CATransaction 類發送一個 begin 消息來創建一個顯式事務,修改完成之后發送 comit 消息。顯式事務在同時設置多個圖層的屬性的時候(例如當布局多個圖層的時候),暫時的禁用圖層的行為,或者暫時修改動畫的時間的時候非常有用 。

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesBegan(touches, with: event)
        
        // 開啟事務
        CATransaction.begin()
        
        // 顯式事務默認開啟動畫效果,kCFBooleanTrue關閉
        CATransaction.setValue(kCFBooleanFalse, forKey: kCATransactionDisableActions)
        
        // 動畫執行時間
        CATransaction.setValue(5.0, forKey: kCATransactionAnimationDuration)
        
        layer.cornerRadius = (layer.cornerRadius == 0.0) ? 30.0 : 0.0
        
        layer.opacity = (layer.opacity == 1.0) ? 0.5 : 1.0
        // 提交事務
        CATransaction.commit()
    }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,002評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,400評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,136評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,714評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,452評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,818評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,812評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,997評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,552評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,292評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,510評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,035評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,721評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,121評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,429評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,235評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,480評論 2 379

推薦閱讀更多精彩內容