當我們需要區實現乙個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...