CoreAnimation手記(一)

學習地址:https://github.com/AttackOnDobby/iOS-Core-Animation-Advanced-Techniques
學習CoreAnimation 的第一步是學習CALayer,因為對一個VIew添加CoreAnimation動畫,本質(zhì)上是對view.lay進行動畫操作.

注意:動畫并不需要你在Core Animation中手動打開许布,相反需要明確地關(guān)閉,否則他會一直存在。

隱式動畫#

所謂的隱式動畫。之所以叫隱式是因為我們并沒有指定任何動畫的類型。我們僅僅改變了一個屬性丹喻,然后Core Animation來決定如何并且何時去做動畫。

本質(zhì):Core Animation在每個run loop周期中自動開始一次新的事務(wù)(run loop是iOS負責收集用戶輸入,處理定時器或者網(wǎng)絡(luò)事件并且重新繪制屏幕的東西)而晒,即使你不顯式的用[CATransaction begin]
開始一次事務(wù),任何在一次run loop循環(huán)中屬性的改變都會被集中起來阅畴,然后做一次0.25秒的動畫倡怎。
<code><pre>
@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 green:green blue:blue alpha:1.0].CGColor;

}

@end
</code></pre>

一:學習第一個類:CATransaction類

(transaction 英 tr?n'z?k?(?)n)有事務(wù)的意思
事務(wù) 實際上是Core Animatino 用來包含一系列屬性動畫集合的機制.任何用指定 事務(wù) 去改變可以做動畫的圖層屬性都不會立刻發(fā)生變化,而是當事務(wù)一旦 提交 的時候開始用一個動畫過渡到新值贱枣。

上面的代碼創(chuàng)建的隱式動畫就是非事務(wù)的動畫.

注意:CATransaction類不能用allloc 和init的方式創(chuàng)建,但是可以通過 +begin 和 +commit 分別來入棧和出棧.

<code><pre>
- (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];
}
</code></pre>

注意旋轉(zhuǎn)動畫要比顏色漸變快得多监署,這是因為完成塊是在顏色漸變的事務(wù)提交并出棧之后才被執(zhí)行,于是冯事,用默認的事務(wù)做變換焦匈,默認的時間也就變成了0.25秒。

解釋:這里可以理解為兩個事務(wù),一個是改變顏色,我們設(shè)定的動畫時間是1.0秒,第二個事務(wù)就是在顏色漸變的事務(wù)提交以后,執(zhí)行的默認事務(wù)時間. 是上面提到的runloop循環(huán)處理的默認時間 0.25秒.

二:UIView圖層上的CALayer動畫

說明:之前的動畫都做在獨立的CALayer 添加到UIView上的.這里的CALayer 是和UIView關(guān)聯(lián)的CALayer 通過self.view.layer 獲取的.

UIView 上的CALayer ,UIView 都會默認成為CALayer 的CALayerDelegate代理對象.
默認實現(xiàn)了

-(id<CAAction>)actionForLayer:(CALayer *)layer forKey:(NSString *)event{

 return nil;
}

禁止了隱式動畫.這里可以理解下

當你改變CALayer的一個可做動畫的屬性昵仅,它并不能立刻在屏幕上體現(xiàn)出來缓熟。相反,它是從先前的值平滑過渡到新的值摔笤。這一切都是默認的行為够滑,你不需要做額外的操作。

我們在修改UIView中l(wèi)ayer屬性的時候,其實是默認有動畫的,只是UIView通過實現(xiàn)上面的圖層代理給禁掉了.

當然返回nil并不是禁用隱式動畫唯一的辦法吕世,CATransaction有個方法叫做+setDisableActions:彰触,可以用來對所有屬性打開或者關(guān)閉隱式動畫。如果在清單7.2的 [CATransaction begin] 之后添加下面的代碼命辖,同樣也會阻止動畫的發(fā)生:

[CATransaction setDisableActions:YES];

最重要的總結(jié)一下况毅,我們知道了如下幾點

  1. UIView關(guān)聯(lián)的圖層禁用了隱式動畫,對這種圖層做動畫的唯一辦法就是使用UIView的動畫函數(shù)(而不是依賴CATransaction)尔艇,或者繼承UIView尔许,并覆蓋-actionForLayer:forKey:方法,或者直接創(chuàng)建一個顯式動畫
  1. 對于單獨存在的圖層终娃,我們可以通過實現(xiàn)圖層的-actionForLayer:forKey:委托方法味廊,或者提供一個actions字典來控制隱式動畫。

備注: 單獨圖層的動畫,改變

<code><pre>
@interface ViewController ()

@property (nonatomic, weak) IBOutlet UIView *layerView;

@property (nonatomic, strong) CALayer *colorLayer;

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

self.colorLayer = [CALayer layer];
self.colorLayer.frame = CGRectMake(50.0f, 50.0f,200.0f, 100.0f);
self.colorLayer.backgroundColor = [UIColor blueColor].CGColor;
//add a custom action
CATransition *transition = [CATransition animation];
transition.type = kCATransitionPush;
transition.subtype = kCATransitionFromLeft;

///這里對actions賦值一個自定對應(yīng)上面總結(jié)的第二點就好理解了,對獨立的圖層的背景顏色添加動畫,
//當顏色改變的時候,顏色改變時,設(shè)置的動畫

self.colorLayer.actions = @{@"backgroundColor": transition};
//add it to our view
[self.layerView.layer addSublayer:self.colorLayer];

}

- (IBAction)action:(id)sender {
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];

}
</code></pre>

呈現(xiàn)模型

暫時還無法理解,先擱下

[self.colorLayer.presentationLayer hitTest:point]

未完待續(xù)......

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市余佛,隨后出現(xiàn)的幾起案子柠新,更是在濱河造成了極大的恐慌,老刑警劉巖辉巡,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恨憎,死亡現(xiàn)場離奇詭異,居然都是意外死亡红氯,警方通過查閱死者的電腦和手機框咙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來痢甘,“玉大人喇嘱,你說我怎么就攤上這事∪ぃ” “怎么了者铜?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長放椰。 經(jīng)常有香客問我作烟,道長,這世上最難降的妖魔是什么砾医? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任拿撩,我火速辦了婚禮,結(jié)果婚禮上如蚜,老公的妹妹穿的比我還像新娘压恒。我一直安慰自己,他們只是感情好错邦,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布探赫。 她就那樣靜靜地躺著,像睡著了一般撬呢。 火紅的嫁衣襯著肌膚如雪伦吠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天魂拦,我揣著相機與錄音毛仪,去河邊找鬼。 笑死芯勘,一個胖子當著我的面吹牛潭千,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播借尿,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了路翻?” 一聲冷哼從身側(cè)響起狈癞,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎茂契,沒想到半個月后蝶桶,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡掉冶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年真竖,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片厌小。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡恢共,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出璧亚,到底是詐尸還是另有隱情讨韭,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布癣蟋,位于F島的核電站透硝,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏疯搅。R本人自食惡果不足惜濒生,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望幔欧。 院中可真熱鬧罪治,春花似錦、人聲如沸琐馆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瘦麸。三九已至谁撼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間滋饲,已是汗流浹背厉碟。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留屠缭,地道東北人箍鼓。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像呵曹,于是被迫代替她去往敵國和親款咖。 傳聞我的和親對象是個殘疾皇子何暮,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

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

  • 前言 本文只要描述了iOS中的Core Animation(核心動畫:隱式動畫、顯示動畫)铐殃、貝塞爾曲線海洼、UIVie...
    GitHubPorter閱讀 3,600評論 7 11
  • 書寫的很好,翻譯的也棒富腊!感謝譯者坏逢,感謝感謝! iOS-Core-Animation-Advanced-Techni...
    錢噓噓閱讀 2,292評論 0 6
  • 在前面的學習中赘被,我們討論了CoreAnimation除了動畫外可以做到的任何事情是整。但是動畫是CoreAni...
    小貓仔閱讀 1,516評論 0 0
  • 在iOS中隨處都可以看到絢麗的動畫效果,實現(xiàn)這些動畫的過程并不復(fù)雜民假,今天將帶大家一窺ios動畫全貌浮入。在這里你可以看...
    每天刷兩次牙閱讀 8,465評論 6 30
  • 在iOS中隨處都可以看到絢麗的動畫效果,實現(xiàn)這些動畫的過程并不復(fù)雜阳欲,今天將帶大家一窺iOS動畫全貌舵盈。在這里你可以看...
    F麥子閱讀 5,096評論 5 13