詳解CoreAnimation中如何自定義動(dòng)畫屬性
CoreAnimation中如何自定義動(dòng)畫屬性是本文要介紹的內(nèi)容,CoreAnimation可以對(duì)UIView里的CALayer進(jìn)行動(dòng)畫處理。它的原理很簡(jiǎn)單,用戶提供一個(gè)初始值,終點(diǎn)值和動(dòng)畫持續(xù)時(shí)間,CoreAnimation自動(dòng)對(duì) 初始值,終點(diǎn)值之間,按照動(dòng)畫持續(xù)時(shí)間進(jìn)行插值(生成中間值),生成中間幀,然后在一個(gè)單獨(dú)的線程里進(jìn)行播放,程序員就不再需要自己去繪制中間幀。
CoreAnimation在對(duì)CALayer進(jìn)行動(dòng)畫生成時(shí),需要用戶指定對(duì)CALayer的哪一個(gè)屬性進(jìn)行插值,也就是必須聲明成@property的變量,使用各個(gè)動(dòng)畫的虛擬超類CAPropertyAnimation的animationWithKeyPath方法來(lái)指定,例如下面的代碼說(shuō)明要對(duì)CALayer的postion屬性進(jìn)行插值。
- CABasicAnimation *aBasicAnimation = [CABasicAnimation animationWithKeyPath:@"position"];
在缺省情況下,能對(duì) CALayer指定的動(dòng)畫屬性是固定的,例如bounds,postion,可以在XCode的開(kāi)發(fā)文檔里查到,但是有的時(shí)候,我們需要對(duì)自定義的屬性進(jìn)行動(dòng)畫生成,這個(gè)就需要子類化CALayer,重載它的needsDisplayForKey方法
- + (BOOL)needsDisplayForKey:(NSString *)aKey {
- if ([aKey isEqualToString:@"myProperty"]) {
- return (YES);
- } else {
- return ([super needsDisplayForKey:aKey]);
- }
- }
在這里,告訴CoreAnimation,我的CALayer子類有一個(gè) myProperty屬性,請(qǐng)對(duì)它進(jìn)行動(dòng)畫插值。接下來(lái),就可以重載
drawInContext方法,添加自己的關(guān)鍵幀繪畫代碼了。
子類化CALayer時(shí),有個(gè)地方要注意,因?yàn)镃oreAnimation在生成中間幀的方式,是通過(guò)Copy操作生成了一大堆中間幀用的CALayer,它在復(fù)制CALayer的數(shù)據(jù)時(shí),只能對(duì)CALayer原有的屬性成員進(jìn)行copy,不會(huì)copy后添加的諸如對(duì)象引用一類的東西,這就需要程序員重載
- - (id)initWithLayer:(id)layer
- {
- self = [super initWithLayer:layer];
- if(self != nil) {
- MyLayer *myLayer = (MyLayer*)layer;
- self.aUIImage = cl.aUIImage;
- }
- return (self);
- }
來(lái)生動(dòng)copy一些沒(méi)法自動(dòng)copy的資源。
寫些小提示,像 drawInContex之類的繪圖方法中,盡量避免CGContextDrawImageInRect之類的元繪圖調(diào)用,因?yàn)檫@些元繪圖操作非常耗時(shí),也是硬件加速幫不上忙的地方,盡量通過(guò)將CGImageRef傳給CALayer.contents屬性的方法把內(nèi)容事先做好傳給CALayer,然后通過(guò)仿射或者3D transform的方法來(lái)進(jìn)行動(dòng)畫變換, 因?yàn)榉律浠蛘?D transform是完全硬件加速的,它比自己書(shū)寫繪圖代碼要快的多的多。
小結(jié):詳解CoreAnimation中如何自定義動(dòng)畫屬性的內(nèi)容介紹完了,希望本文對(duì)你有所幫助!