Core Animation 相關(guān)

CATransaction事務(wù)

<br />

CALayer的"Animatable"屬性的設(shè)置都應(yīng)該屬于某一個(gè)CATransaction事務(wù)砂吞,CATransaction的作用是保證多個(gè)"Animatable"的變化同時(shí)進(jìn)行跨细。也就是說CALayer的屬性改變需要依賴CATransaction掷豺。

CATransaction也分為隱式顯示

隱式:在某次RunLoop中設(shè)置了一個(gè)"Animatable"屬性逞盆,如果當(dāng)前沒有設(shè)置事務(wù),則會(huì)自動(dòng)創(chuàng)建一個(gè)CATransaction令野,并在當(dāng)前線程的下一個(gè)RunLoop中commit這個(gè)CATransaction轻专。

顯示: 就是直接調(diào)用CATransaction的[CATransaction begin]王财,[CATransaction commit]等相關(guān)方法卵迂。比如我們不希望self.subLayer.position = CGPointMake(100,100)產(chǎn)生動(dòng)畫,則可以在CATransaction中設(shè)置 setDisableActions: YES

另外事務(wù)可以嵌套绒净,當(dāng)事務(wù)嵌套時(shí)见咒,只有最外層的事務(wù)commit之后,整個(gè)動(dòng)畫才開始挂疆。

<br />


自定義CALayer

<br />

自定義Layer有兩種方法:

  • 通過delegate改览,在delegate里面實(shí)現(xiàn)layer內(nèi)容的繪制及渲染
// 方法一
  CALayer *customerLayer = [CALayer layer];
  customerLayer.bounds = CGRectMake(0, 0, 200, 200);
  customerLayer.position = CGPointMake(self.view.frame.size.width * 0.5, self.view.frame.size.height * 0.5);
  customerLayer.backgroundColor = [UIColor redColor].CGColor;
  customerLayer.delegate = self;
  // - (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx 該代理方法不會(huì)自動(dòng)調(diào)用 必須主動(dòng)調(diào)用setNeedDisplay方法才會(huì)觸發(fā)
  [customerLayer setNeedsDisplay];
  [self.view.layer addSublayer:customerLayer];

代理方法

  #pragma mark - layer delegate
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx {
    CGContextAddEllipseInRect(ctx, CGRectMake(0, 0, 100, 100));
    CGContextSetRGBFillColor(ctx, 0, 1, 0, 1);
    CGContextFillPath(ctx);
}  
  • 通過override自定義layer里面的 - (void)drawInContext:(CGContextRef)ctx
// 方法二
  WYLayer *customerLayer = [WYLayer layer];
  customerLayer.bounds = CGRectMake(0, 0, 200, 200);
  customerLayer.position = CGPointMake(self.view.frame.size.width * 0.5, self.view.frame.size.height * 0.5);
  // - (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx 該代理方法不會(huì)自動(dòng)調(diào)用 必須主動(dòng)調(diào)用setNeedDisplay方法才會(huì)觸發(fā)
  [customerLayer setNeedsDisplay];
  [self.view.layer addSublayer:customerLayer];

自定義WYLayer

   #import "WYLayer.h"

  @implementation WYLayer

  // 重寫該方法, 在該方法中給layer上繪制圖形
  // 注意CALayer中的drawInContext方法, 不會(huì)自動(dòng)調(diào)用
  // 只能自己通過setNeedDisplay方法調(diào)用
  - (void)drawInContext:(CGContextRef)ctx {
         CGContextAddEllipseInRect(ctx, CGRectMake(0, 0, 100, 100));
         // Attention:不能用UIKit框架中的類
        //    [[UIColor redColor] set];
        CGContextSetRGBFillColor(ctx, 0, 1, 0, 1);
        CGContextFillPath(ctx);
  }

  @end

<br />


CABaseAnimation

CAPropertyAnimation的子類

屬性解析:
fromValuekeyPath相應(yīng)屬性的初始值
toValuekeyPath相應(yīng)屬性的結(jié)束值
隨著動(dòng)畫的進(jìn)行,在長(zhǎng)度為duration的持續(xù)時(shí)間內(nèi)缤言,keyPath相應(yīng)屬性的值從fromValue漸漸地變?yōu)?code>toValue

Attention:如果fillMode=kCAFillModeForwards和removedOnComletion=NO宝当,那么在動(dòng)畫執(zhí)行完畢后,圖層會(huì)保持顯示動(dòng)畫執(zhí)行后的狀態(tài)胆萧。但在實(shí)質(zhì)上庆揩,圖層的屬性值還是動(dòng)畫執(zhí)行前的初始值,并沒有真正被改變跌穗。比如订晌,CALayer的position初始值為(0,0),CABasicAnimation的fromValue為(10,10)蚌吸,toValue為(100,100)锈拨,雖然動(dòng)畫執(zhí)行完畢后圖層保持在(100,100)這個(gè)位置,實(shí)質(zhì)上圖層的position還是為(0,0)

 // 創(chuàng)建基本動(dòng)畫
CABasicAnimation *animation = [CABasicAnimation animation];
// 設(shè)置動(dòng)畫類型
animation.keyPath = @"transform";
// 設(shè)置動(dòng)畫結(jié)束后不刪除動(dòng)畫
animation.removedOnCompletion = NO;
// 設(shè)置動(dòng)畫結(jié)束后的最新狀態(tài)
animation.fillMode = kCAFillModeForwards;
// 設(shè)置動(dòng)畫時(shí)長(zhǎng)
animation.duration = 4;
// 設(shè)置移動(dòng)位置
animation.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI_2, 0, 0, 1)];

[self.myLayer addAnimation:animation forKey:nil];

<br />


CAKeyFrameAnimation

CApropertyAnimation的子類套利,跟CABasicAnimation的區(qū)別是:CABasicAnimation只能從一個(gè)數(shù)值fromValue變到另一個(gè)數(shù)值toValue推励,而CAKeyframeAnimation會(huì)使用一個(gè)NSArray保存這些數(shù)值。

屬性解析:
values:就是上述的NSArray對(duì)象肉迫。里面的元素稱為”關(guān)鍵幀”(keyframe)验辞。動(dòng)畫對(duì)象會(huì)在指定的時(shí)間duration內(nèi),依次顯示values數(shù)組中的每一個(gè)關(guān)鍵幀
path:可以設(shè)置一個(gè)CGPathRef\CGMutablePathRef,讓層跟著路徑移動(dòng)喊衫。path只對(duì)CALayer的anchorPointposition起作用跌造。<u>如果你設(shè)置了path,那么values將被忽略</u>族购。
keyTimes:可以為對(duì)應(yīng)的關(guān)鍵幀指定對(duì)應(yīng)的時(shí)間點(diǎn),其取值范圍為0到1.0,keyTimes中的每一個(gè)時(shí)間值都對(duì)應(yīng)values中的每一幀.當(dāng)keyTimes沒有設(shè)置的時(shí)候,各個(gè)關(guān)鍵幀的時(shí)間是平分的壳贪。
CABasicAnimation可看做是最多只有2個(gè)關(guān)鍵幀的CAKeyframeAnimation。

關(guān)鍵幀動(dòng)畫的創(chuàng)建可以有兩種方式:

values

// 1.創(chuàng)建核心動(dòng)畫
CAKeyframeAnimation *keyAnima = [CAKeyframeAnimation animation];
// 1.1告訴系統(tǒng)執(zhí)行什么動(dòng)畫
keyAnima.keyPath = @"position";
//    NSValue *v1 = [NSValue valueWithCGPoint:CGPointMake(0, 100)];
NSValue *v2 = [NSValue valueWithCGPoint:CGPointMake(100, 100)];
NSValue *v3 = [NSValue valueWithCGPoint:CGPointMake(100, 200)];
NSValue *v4 = [NSValue valueWithCGPoint:CGPointMake(0, 200)];
NSValue *v5 = [NSValue valueWithCGPoint:CGPointMake(0, 100)];

keyAnima.values = @[v2, v3, v4, v5];

//    keyAnima.keyTimes = @[@(0.5) ,@(0.5), @(0.5)];

keyAnima.timingFunction =  [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];

// 1.2保存執(zhí)行完之后的狀態(tài)
// 1.2.1執(zhí)行完之后不刪除動(dòng)畫
keyAnima.removedOnCompletion = NO;
// 1.2.2執(zhí)行完之后保存最新的狀態(tài)
keyAnima.fillMode = kCAFillModeForwards;

// 1.3設(shè)置動(dòng)畫時(shí)間
keyAnima.duration = 2;

// 2.觀察動(dòng)畫什么時(shí)候開始執(zhí)行, 以及什么時(shí)候執(zhí)行完畢
keyAnima.delegate = self;


// 2.添加核心動(dòng)畫
[self.customView.layer addAnimation:keyAnima forKey:nil];

path

// 1.創(chuàng)建核心動(dòng)畫
CAKeyframeAnimation *keyAnima = [CAKeyframeAnimation animation];
// 1.1告訴系統(tǒng)執(zhí)行什么動(dòng)畫
keyAnima.keyPath = @"position";

CGMutablePathRef path = CGPathCreateMutable();
CGPathAddEllipseInRect(path, NULL, CGRectMake(0, 100, 200, 200));

keyAnima.path = path;
CGPathRelease(path);

// 1.2保存執(zhí)行完之后的狀態(tài)
// 1.2.1執(zhí)行完之后不刪除動(dòng)畫
keyAnima.removedOnCompletion = NO;
// 1.2.2執(zhí)行完之后保存最新的狀態(tài)
keyAnima.fillMode = kCAFillModeForwards;

// 1.3設(shè)置動(dòng)畫時(shí)間
keyAnima.duration = 2;
// 2.觀察動(dòng)畫什么時(shí)候開始執(zhí)行, 以及什么時(shí)候執(zhí)行完畢
keyAnima.delegate = self;
// 3.添加核心動(dòng)畫
[self.customView.layer addAnimation:keyAnima forKey:@"abc"];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末寝杖,一起剝皮案震驚了整個(gè)濱河市违施,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瑟幕,老刑警劉巖磕蒲,帶你破解...
    沈念sama閱讀 211,496評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異只盹,居然都是意外死亡辣往,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,187評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門殖卑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來站削,“玉大人,你說我怎么就攤上這事孵稽⌒砥穑” “怎么了?”我有些...
    開封第一講書人閱讀 157,091評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵肛冶,是天一觀的道長(zhǎng)街氢。 經(jīng)常有香客問我,道長(zhǎng)睦袖,這世上最難降的妖魔是什么珊肃? 我笑而不...
    開封第一講書人閱讀 56,458評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮馅笙,結(jié)果婚禮上伦乔,老公的妹妹穿的比我還像新娘。我一直安慰自己董习,他們只是感情好烈和,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,542評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著皿淋,像睡著了一般招刹。 火紅的嫁衣襯著肌膚如雪恬试。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,802評(píng)論 1 290
  • 那天疯暑,我揣著相機(jī)與錄音训柴,去河邊找鬼。 笑死妇拯,一個(gè)胖子當(dāng)著我的面吹牛幻馁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播越锈,決...
    沈念sama閱讀 38,945評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼仗嗦,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了甘凭?” 一聲冷哼從身側(cè)響起稀拐,我...
    開封第一講書人閱讀 37,709評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎对蒲,沒想到半個(gè)月后钩蚊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,158評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蹈矮,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,502評(píng)論 2 327
  • 正文 我和宋清朗相戀三年砰逻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泛鸟。...
    茶點(diǎn)故事閱讀 38,637評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蝠咆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出北滥,到底是詐尸還是另有隱情刚操,我是刑警寧澤,帶...
    沈念sama閱讀 34,300評(píng)論 4 329
  • 正文 年R本政府宣布再芋,位于F島的核電站菊霜,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏济赎。R本人自食惡果不足惜鉴逞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,911評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望司训。 院中可真熱鬧构捡,春花似錦、人聲如沸壳猜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,744評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)统扳。三九已至喘帚,卻和暖如春畅姊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背吹由。 一陣腳步聲響...
    開封第一講書人閱讀 31,982評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工涡匀, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人溉知。 一個(gè)月前我還...
    沈念sama閱讀 46,344評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像腕够,于是被迫代替她去往敵國(guó)和親级乍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,500評(píng)論 2 348

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

  • 在iOS中隨處都可以看到絢麗的動(dòng)畫效果帚湘,實(shí)現(xiàn)這些動(dòng)畫的過程并不復(fù)雜玫荣,今天將帶大家一窺ios動(dòng)畫全貌。在這里你可以看...
    每天刷兩次牙閱讀 8,471評(píng)論 6 30
  • 在iOS中隨處都可以看到絢麗的動(dòng)畫效果大诸,實(shí)現(xiàn)這些動(dòng)畫的過程并不復(fù)雜捅厂,今天將帶大家一窺iOS動(dòng)畫全貌。在這里你可以看...
    F麥子閱讀 5,104評(píng)論 5 13
  • 一资柔、簡(jiǎn)介 Core Animation焙贷,中文翻譯為核心動(dòng)畫,它是一組非常強(qiáng)大的動(dòng)畫處理API贿堰,使用它能做出非常炫麗...
    莦婼姑娘閱讀 956評(píng)論 0 4
  • 在iOS實(shí)際開發(fā)中常用的動(dòng)畫無非是以下四種:UIView動(dòng)畫辙芍,核心動(dòng)畫,幀動(dòng)畫羹与,自定義轉(zhuǎn)場(chǎng)動(dòng)畫故硅。 1.UIView...
    請(qǐng)叫我周小帥閱讀 3,082評(píng)論 1 23
  • 書寫的很好,翻譯的也棒纵搁!感謝譯者吃衅,感謝感謝! iOS-Core-Animation-Advanced-Techni...
    錢噓噓閱讀 2,293評(píng)論 0 6