自定義CALayer動畫

2021-08-03 05:28:35 字數 1557 閱讀 3502

當我們需要區實現乙個layer的時候,並且需要為其新增乙個屬性動畫的時候,我們需要有這麼幾步操作:

首先,我們需要去繼承乙個calayer類,同時實現以下的幾個方法:

+ (bool

)needsdisplayforkey:(

nsstring

*)key

方法來判斷當前屬性改變是否需要重新繪製。如果想實現自定義動畫就需要過載這個方法,當key等於擴充套件屬性時return yes即可;

這句話什麼意思?這裡在layer中有這麼乙個方法 - (

void

)drawincontext:(

cgcontextref

)ctx  ,這個方法就類似於我們去寫乙個自定義的view,而在view中需要重寫drawrect方法一樣,用來實現繪圖。而以上方法也正是呼叫這個方法去繪圖。

我們先來建立乙個circlelayer類:

#import 

#import 

#import 

@inte***ce circlelayer :calayer

@property(nonatomic,assign)

cgfloat

progress;

@end

在.m中過載一下這兩個方法:

- (void)drawincontext:(cgcontextref)ctx

+ (bool)needsdisplayforkey:(nsstring *)key

稍微說明下:drawincontext 繪製乙個圓圈,根據progress繪製出實際的弧度,progress正是我們的自定義屬性。needsdisplayforkey 自然是讓progress自動呼叫setneedsdisplay。需要注意的是,我們也可以直接去呼叫setneedsdisplay去令其直接畫圖。

定義好我們的自定義layer後,只要為其新增動畫即可:

cabasicanimation* animat = [cabasicanimation

animationwithkeypath

:@"progress"];

animat.duration =6.f;

animat.

fromvalue

= [nsnumber

numberwithfloat:[(

circlelayer

*)[layer

presentationlayer]

progress

]];

animat.tovalue = [nsnumber

numberwithfloat:1.0f];

animat.timingfunction= [

camediatimingfunction

functionwithname

:kcamediatimingfunctioneaseineaseout]; [

layer

addanimation:animatforkey:

@"gogogo"];

CALayer 自定義屬性繪製動畫

建立circlelayer繼承calayer,新增新屬性angle。inte cecirclelayer calayer property nonatomic,assign cgfloatangle end 覆蓋父類方法,新增新的屬性動畫鍵值,返回yes表示給定的屬性發生變化時導致layer的內容重...

CALayer自定義層

自定義層,其實就是在層上繪圖,一共有2種方法,下面詳細介紹一下。方法描述 建立乙個calayer的子類,然後覆蓋drawincontext 方法,使用quartz2d api進行繪圖 pragma mark 繪製乙個實心三角形 4 void drawincontext cgcontextref ct...

iOS核心動畫之CALayer 自定義層

本文目錄 自定義層,其實就是在層上繪圖,一共有2種方法,下面詳細介紹一下。回到頂部 方法描述 建立乙個calayer的子類,然後覆蓋drawincontext 方法,使用quartz2d api進行繪圖 pragma mark 繪製乙個實心三角形 4 void drawincontext cgcon...