IOS 開發(fā)- 隱式動畫

Do What I mean, not what I say

Implicit Animations

首先看一個demo

@interface ViewController ()
@property (nonatomic, weak) IBOutlet UIView *layerView; @property (nonatomic, weak) IBOutlet CALayer *colorLayer;
@end
@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    //create sublayer
    self.colorLayer = [CALayer layer];
    self.colorLayer.frame = CGRectMake(50.0f, 50.0f, 100.0f, 100.0f);
    self.colorLayer.backgroundColor = [UIColor blueColor].CGColor;
    //add it to our view
    [self.layerView.layer addSublayer:self.colorLayer]; }

- (IBAction)changeColor {
    //randomize the layer background color 
    CGFloat red = arc4random() / (CGFloat)INT_MAX; 
    CGFloat green = arc4random() / (CGFloat)INT_MAX;
    CGFloat blue = arc4random() / (CGFloat)INT_MAX;
    self.colorLayer.backgroundColor = [UIColor colorWithRed:red]
}
@end

在這個程序中襟士,我們并沒有看到任何代碼和動畫相關(guān)蜕青。我們只是單純的更改了一個非UIView關(guān)聯(lián)的Layer的屬性(一定要是非UIView相關(guān)聯(lián)的Layer,后文會解釋原因)。當(dāng)我們改變一個屬性時怀薛,Core Animation是怎么判斷動畫類型和持續(xù)時間呢?實際上動畫執(zhí)行的時間取決于當(dāng)前事務(wù)(Transaction)的設(shè)置,動畫類型取決于圖層行為(Layer Action)傍药。事務(wù)實際上是Core Animation用來包含一系列動畫集合的機(jī)制,任何時候在一個指定事務(wù)中去改變都不會立刻發(fā)生變化,而是當(dāng)事務(wù)提交的時候開始用一個動畫過渡到新值拐辽。事務(wù)是通過CATransation 類來管理的拣挪,這個類的設(shè)計很有意思,不像它的名字俱诸,它管理了一個你不能直接訪問的事務(wù)的棧菠劝。CATransaction沒有屬性或者實例方法,并且也不能使用alloc睁搭,init來創(chuàng)建赶诊。然而,你可以通過類方法园骆,+begin和+commit來把一個新的事務(wù)壓入棧中舔痪,或者推出當(dāng)前事件。

任何的一個可動畫的圖層的屬性的變化都會被添加到棧頂?shù)氖聞?wù)锌唾。(Any layer property change that can be animated will be added to the topmost transaction in the stack.)你可以通過+setAnimationDuration: 方法來設(shè)置當(dāng)前事務(wù)的動畫時間锄码,或者,通過+animationDuration 方法來獲取當(dāng)前的動畫時間晌涕。

Core Animation 在每一個run loop周期中自動開始一個新的事務(wù)滋捶,即是你不顯示的使用[CATransaction begin]開始一個新的事務(wù),任何一次在run loop循環(huán)中屬性的改變都會被集中起來余黎,然后坐一次0.25秒的動畫重窟。明白了這些之后,我們就可以輕松的修改變色動畫的時間了驯耻,我們當(dāng)然可以使用當(dāng)前事務(wù)的+setAnimationDuration:方法來修改動畫持續(xù)時間亲族,但是我們先起一個新的事務(wù),這樣的話修改時間就不會產(chǎn)生副作用可缚,因為修改當(dāng)前事務(wù)的時間可能會影響統(tǒng)一時刻的其他動畫霎迫,所以最好還是在調(diào)整動畫之前壓入一個新的事務(wù)。

- (IBAction)changeColor {
    //begin a new transaction
    [CATransaction begin];
    //set the animation duration to 1 second
    [CATransaction setAnimationDuration:1.0];
    //randomize the layer background color
    CGFloat red = arc4random() / (CGFloat)INT_MAX;
    CGFloat green = arc4random() / (CGFloat)INT_MAX;
    CGFloat blue = arc4random() / (CGFloat)INT_MAX;
    self.colorLayer.backgroundColor = [UIColor colorWithRed:red
    //commit the transaction
    [CATransaction commit]; 
}

完成塊
基于UIView的block動畫允許你在動畫結(jié)束的時候提供一個完成塊帘靡。CATransaction接口提供的+setCompleteBlock:方法也有同樣的功能知给。

- (IBAction)changeColor {
    //begin a new transaction
    [CATransaction begin];
    //set the animation duration to 1 second
    [CATransaction setAnimationDuration:1.0]; //add the spin animation on completion
    [CATransaction setCompletionBlock:^{
    //rotate the layer 90 degrees
    CGAffineTransform transform = self.colorLayer.affineTransform; 
    transform = CGAffineTransformRotate(transform, M_PI_2); 
    self.colorLayer.affineTransform = transform;
}];

    //randomize the layer background color
    CGFloat red = arc4random() / (CGFloat)INT_MAX;
    CGFloat green = arc4random() / (CGFloat)INT_MAX;
    CGFloat blue = arc4random() / (CGFloat)INT_MAX;
    self.colorLayer.backgroundColor = [UIColor colorWithRed:red green:green blue:blue alpha:1.0].CGColor;
    //commit the transaction
    [CATransaction commit]; 
}

注意,旋轉(zhuǎn)動畫要比顏色漸變快得多描姚,這事因為完成塊是在顏色漸變得事務(wù)提交并出棧之后才被執(zhí)行涩赢,所以,用默認(rèn)的事務(wù)做變換轩勘,默認(rèn)的時間也變成了0.25秒筒扒。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市绊寻,隨后出現(xiàn)的幾起案子花墩,更是在濱河造成了極大的恐慌悬秉,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冰蘑,死亡現(xiàn)場離奇詭異和泌,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)祠肥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進(jìn)店門武氓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人仇箱,你說我怎么就攤上這事县恕。” “怎么了工碾?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵弱睦,是天一觀的道長。 經(jīng)常有香客問我渊额,道長况木,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任旬迹,我火速辦了婚禮火惊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘奔垦。我一直安慰自己屹耐,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布椿猎。 她就那樣靜靜地躺著惶岭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪犯眠。 梳的紋絲不亂的頭發(fā)上按灶,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天,我揣著相機(jī)與錄音筐咧,去河邊找鬼鸯旁。 笑死,一個胖子當(dāng)著我的面吹牛量蕊,可吹牛的內(nèi)容都是我干的铺罢。 我是一名探鬼主播,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼残炮,長吁一口氣:“原來是場噩夢啊……” “哼韭赘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起势就,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤泉瞻,失蹤者是張志新(化名)和其女友劉穎楷怒,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瓦灶,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年抱完,在試婚紗的時候發(fā)現(xiàn)自己被綠了贼陶。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡巧娱,死狀恐怖碉怔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情禁添,我是刑警寧澤撮胧,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站老翘,受9級特大地震影響芹啥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜铺峭,卻給世界環(huán)境...
    茶點故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一墓怀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧卫键,春花似錦傀履、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至絮宁,卻和暖如春梆暮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背羞福。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工惕蹄, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人治专。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓卖陵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親张峰。 傳聞我的和親對象是個殘疾皇子泪蔫,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,922評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 在iOS中隨處都可以看到絢麗的動畫效果,實現(xiàn)這些動畫的過程并不復(fù)雜喘批,今天將帶大家一窺iOS動畫全貌撩荣。在這里你可以看...
    F麥子閱讀 5,118評論 5 13
  • 在iOS中隨處都可以看到絢麗的動畫效果铣揉,實現(xiàn)這些動畫的過程并不復(fù)雜,今天將帶大家一窺ios動畫全貌餐曹。在這里你可以看...
    每天刷兩次牙閱讀 8,516評論 6 30
  • 前言 本文只要描述了iOS中的Core Animation(核心動畫:隱式動畫逛拱、顯示動畫)、貝塞爾曲線台猴、UIVie...
    GitHubPorter閱讀 3,640評論 7 11
  • 在iOS實際開發(fā)中常用的動畫無非是以下四種:UIView動畫朽合,核心動畫,幀動畫饱狂,自定義轉(zhuǎn)場動畫曹步。 1.UIView...
    請叫我周小帥閱讀 3,114評論 1 23
  • 在前面的學(xué)習(xí)中,我們討論了CoreAnimation除了動畫外可以做到的任何事情休讳。但是動畫是CoreAni...
    小貓仔閱讀 1,527評論 0 0