CAShapeLayer & UIBezierPath & CABasicAnimation

CAShapeLayer

普通CALayer在被初始化時是需要給一個frame值的,這個frame值一般都與給定view的bounds值一致,它本身是有形狀的,而且是矩形.
每個CAShapeLayer對象都代表著將要被渲染到屏幕上的形狀(shape),CAShapeLayer在初始化時也需要給一個frame值,但是,它本身沒有形狀,它的形狀來源于你給定的一個path,然后它去取CGPath值,它與CALayer有著很大的區(qū)別.

并且,系統(tǒng)僅會渲染CAShapeLayer對象的形狀柱蟀,其他任何非CAShapeLayer的自由屬性在渲染是都會被忽略河绽。因此從某種意義上講CAShapeLayer僅是形狀的容器。雖然由于其實CALayer的子類,可以設(shè)置contents疑枯、backgroundColor等屬性廉赔,但這些屬性在渲染時也會被忽略。

- 但是辽慕,CAShapeLayer提供了自身的可設(shè)置性:

path fillColor fillRule strokeColor
strokeStart strokeEnd lineWidth miterLimit
lineCap lineJoin lineDashPhase lineDashPattern
  • path
    動畫路徑,默認為NULL赦肃,不支持隱式動畫溅蛉。路徑可以使用任何的具體子類的動畫CAPropertyAnimation。如果此屬性的值是不為NULL他宛,則path使用指定的路徑船侧,而不是創(chuàng)建該層的合成后的alpha通道。它使用的是非零纏繞規(guī)則和當前顏色厅各,不透明度和模糊半徑填充镜撩。

  • fillColor
    填充顏色,默認為不透明的黑色队塘,若值為nil袁梗,則沒有填充效果宜鸯。
    fillColor針對于閉合的圖形,對于鏤空圖形只需設(shè)置畫筆顏色strokeColor即可遮怜。

//閉合多邊形
- (void)drawTriangle {
    UIView *view = [self.view viewWithTag:1026];
    
    CAShapeLayer *triangle = [CAShapeLayer layer];
    triangle.lineWidth = 2;
    triangle.strokeColor = [UIColor clearColor].CGColor;
    triangle.fillColor = [UIColor redColor].CGColor;
    [view.layer addSublayer:triangle];
    
    UIBezierPath *bezierPath = [UIBezierPath bezierPath];
    [bezierPath moveToPoint:CGPointMake(kDeviceWidth/2.0, 50)];
    [bezierPath addLineToPoint:CGPointMake(kDeviceWidth/2.0-100, 150)];
    [bezierPath addLineToPoint:CGPointMake(kDeviceWidth/2.0+100, 150)];
    [bezierPath addLineToPoint:CGPointMake(kDeviceWidth/2.0, 50)];
    
    triangle.path = bezierPath.CGPath;
}
fillColor和strokeColor兩種設(shè)置的效果
  • fillRule
    填充規(guī)則淋袖,默認是kCAFillRuleNonZero。
    kCAFillRuleNonZero:指定非零纏繞規(guī)則锯梁。計算每個左到右的路徑+1或-1為每個從右到左的道路即碗。如果所有交叉的總和為0,則點是路徑之外陌凳,如果該和為非零剥懒,改點是在路徑內(nèi)與包含它的區(qū)域被填充。
    kCAFillRuleEvenOdd:指定奇偶纏繞規(guī)則合敦。算路徑交叉的總和初橘,如果橫跨的數(shù)目是偶數(shù),改點在路徑之外蛤肌。如果橫跨的數(shù)目是奇數(shù)壁却,所述點是在路徑內(nèi)與包含它的區(qū)域應(yīng)被填充。

  • strokeColor
    畫筆顏色裸准。

  • strokeStart
    和strokeEnd組合使用,默認值為1.0赔硫,取值范圍0.0~1.0

  • strokeEnd
    和strokeStart組合使用炒俱,默認值為1.0,取值范圍為0.0~1.0

  • lineWidth
    線寬爪膊。注意線寬有一個特點权悟,線寬從你設(shè)置的起點往左右兩邊同時伸展。

  • miterLimit
    斜接樣式推盛,默認值為10.0

  • lineCap
    線端點樣式峦阁,默認值為kCALineCapButt,還有kCALineCapRound耘成,kCALineCapSquare


    線端點樣式示例
  • lineJoin
    拐角樣式榔昔,默認值為kCALineJoinMiter(尖角),還有kCALineJoinRound(圓角)瘪菌,kCALineJoinBevel(平角)


    拐角樣式示例
  • lineDashPhase
    沖刺階段應(yīng)用到的形狀的路徑撒会,默認是0.0

  • lineDashPattern
    設(shè)置線的樣式,默認為實線师妙,該數(shù)組為一個NSNumber數(shù)組诵肛,數(shù)組中的數(shù)值依次表示虛線中,單個線的長度默穴,和空白的長度怔檩,如:數(shù)組@[@10,@5] 表示 有長度為10的線褪秀,長度為5的空白,不斷循環(huán)后組成的虛線薛训。
    當然數(shù)組的長度是不做限制的媒吗,你亦可以@[@2,@3,@4,@5],可以表示為長度為2的線+長度為3的空白+長度為4的線+長度為5的空白,不斷循環(huán)直到線段結(jié)束许蓖。

  • mask
    mask本身就是個CALayer蝴猪,mask屬性用作裁剪功能。
    mask只作為形狀(shape)的樣子膊爪,裁剪后的形狀以mask為準自阱,其他例如顏色等屬性以原圖為準。


    兩種mask裁剪示例

- CAShapeLayer有以下幾點特點:

  • 它依附于一個path米酬,必須給予path沛豌,即使path不完整也會自動首尾相接。
  • strokeStartstrokeEnd代表著在這個path中所占用的百分比赃额。
  • CAShapeLayer動畫僅限于沿著邊緣的動畫效果加派,它不能直接實現(xiàn)填充效果,但可以間接實現(xiàn)填充效果跳芳。

UIBezierPath

使用UIBezierPath可以創(chuàng)建基于矢量的路徑芍锦,此類是Core Graphics框架關(guān)于路徑的封裝。使用此類可以定義簡單的形狀飞盆,如橢圓娄琉、矩形或有多個直線和曲線組成的形狀等。

UIBezierPathCGPathRef數(shù)據(jù)類型的封裝吓歇。如果是基于矢量形狀的路徑孽水,都用直線或曲線去創(chuàng)建。我們使用直線段去創(chuàng)建矩形和多邊形城看,使用曲線去創(chuàng)建圓弧女气、圓或其他復(fù)雜的曲線形狀。

  • 最基本的初始化方法测柠,用它創(chuàng)建的對象炼鞠,我們可以根據(jù)我們的需要任意定制樣式,可以話任何想畫的圖形鹃愤。
+ (instancetype)bezierPath;
  • 初始化一個矩形矩形貝塞爾曲線簇搅。
+ (instancetype)bezierPathWithRect:(CGRect)rect;
  • 根據(jù)一個矩形畫內(nèi)切曲線,通常用來畫圓或橢圓(取決于傳入的rect是正方形還是長方形)软吐。
+ (instancetype)bezierPathWithOvalInRect:(CGRect)rect;
  • 畫矩形瘩将,但是這個矩形可以畫圓角。第一個參數(shù)是矩形,第二個參數(shù)是圓角大小姿现。
+ (instancetype)bezierPathWithRoundedRect:(CGRect)rect cornerRadius:(CGFloat)cornerRadius;
  • 畫矩形肠仪,矩形可以圓角,可以指定某個角或其中多個角成為圓角备典。參數(shù):UIRectCornerTopLeft异旧,UIRectCornerTopRightUIRectCornerBottomLeft提佣,UIRectCornerBottomRight吮蛹,UIRectCornerAllCorners
+ (instancetype)bezierPathWithRoundedRect:(CGRect)rect byRoundingCorners:(UIRectCorner)corners cornerRadii:(CGSize)cornerRadii;
  • 畫弧線,參數(shù)說明:
    • center 弧線中心點的坐標
    • radius 弧線所在圓的半徑
    • startAngle 弧線開始的角度值
    • endAngle 弧線結(jié)束的角度值
    • clockwise 是否順時針畫弧線
+ (instancetype)bezierPathWithArcCenter:(CGPoint)center radius:(CGFloat)radius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle clockwise:(BOOL)clockwise;

CABasicAnimation

CABasicAnimation類的使用方式就是關(guān)鍵幀動畫拌屏,所謂關(guān)鍵幀動畫潮针,就是將Layer的屬性作為keyPath來注冊,指定動畫的起始幀和結(jié)束幀倚喂,然后自動計算和實現(xiàn)中間的過渡動畫的一種動畫方式每篷。

CABasicAnimation自己只有三個property:

@property(nullable, strong) id fromValue;
@property(nullable, strong) id toValue;
@property(nullable, strong) id byValue

當創(chuàng)建一個CABasicAnimation的時候,需要通過 -setFromValue-setToValue 來指定一個開始值和結(jié)束值端圈。當你增加基礎(chǔ)動畫到層中的時候焦读,它開始運行。當用屬性做動畫完成時舱权,例如用位置屬性做動畫矗晃,層就會立刻返回到它的初始位置。

- 設(shè)定動畫的屬性說明

屬性 說明
duration 動畫時長(單位:秒)
repeatCount 重復(fù)次數(shù)宴倍,永久重復(fù)的話設(shè)置為HUGE_VALF
beginTime 指定動畫開始時間喧兄。從開始指定延遲幾秒執(zhí)行的話,請設(shè)置為「CACurrentMediaTime() + 秒數(shù)」的形式
timingFunction 設(shè)定動畫的速度變化
autoreverses 動畫結(jié)束時是否執(zhí)行逆動畫
shadowColor 陰影的顏色
shadowOffset 陰影的偏移量
shadowOpacity 陰影的透明度
shadowRadius 陰影的圓角
fromValue 所改變屬性的起始值
toValue 所改變屬性的結(jié)束時的值
byValue 所改變屬性相同起始值得改變量 ;

- 常用的animationWithKeyPath值的總結(jié)

說明 使用形式
transform.scale 比例轉(zhuǎn)化 @(0.8)
transform.scale.x 寬的比例 @(0.8)
transform.scale.y 高的比例 @(0.8)
transform.rotation.x 圍繞x軸旋轉(zhuǎn) @(M_PI)
transform.rotation.y 圍繞y軸旋轉(zhuǎn) @(M_PI)
transform.rotation.z 圍繞z軸旋轉(zhuǎn) @(M_PI)
cornerRadius 圓角的設(shè)置 @(20)
backgroundColor 背景顏色的變化 [UIColor orangeColor].CGColor;
bounds 大小啊楚,中心不變 [NSValue valueWithCGRect:CGRectMake(100,100)];
position 位置(中心點的改變) [NSValue valueWithCGPoint:CGPointMake(100,100)];
contents 內(nèi)容(比如UIImageView的圖片) imageAnima.toValue = (id)[UIImage imageNamed:@“toIcon”].CGImage;
opacity 透明度 @(0.8)
contentsRect.size.width 橫向拉伸縮放 @(0.5)最好在0~1之間
- 捕獲動畫開始時和終了時的事件

設(shè)置委托對象,實現(xiàn)委托方法浑彰。

/** 
 * 動畫開始時 
 */
- (void)animationDidStart:(CAAnimation *)theAnimation {
    NSLog(@"begin");  
}  
   
/** 
 * 動畫結(jié)束時 
 */  
- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag {  
    NSLog(@"end");  
}  

結(jié)語

CAShapeLayerUIBezierPath規(guī)定一個形狀恭理,CABasicAnimation為其添加動畫。下一篇我將寫具體的實例郭变。最后颜价,非常感謝您閱讀本文。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末诉濒,一起剝皮案震驚了整個濱河市周伦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌未荒,老刑警劉巖专挪,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡寨腔,警方通過查閱死者的電腦和手機速侈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來迫卢,“玉大人倚搬,你說我怎么就攤上這事∏颍” “怎么了每界?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長家卖。 經(jīng)常有香客問我眨层,道長,這世上最難降的妖魔是什么篡九? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任谐岁,我火速辦了婚禮,結(jié)果婚禮上榛臼,老公的妹妹穿的比我還像新娘伊佃。我一直安慰自己,他們只是感情好沛善,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布荒给。 她就那樣靜靜地躺著,像睡著了一般喊暖。 火紅的嫁衣襯著肌膚如雪级乐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天尤蛮,我揣著相機與錄音媳友,去河邊找鬼。 笑死产捞,一個胖子當著我的面吹牛醇锚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播坯临,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼焊唬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了看靠?” 一聲冷哼從身側(cè)響起赶促,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎挟炬,沒想到半個月后鸥滨,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嗦哆,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年爵赵,在試婚紗的時候發(fā)現(xiàn)自己被綠了吝秕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡空幻,死狀恐怖烁峭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情秕铛,我是刑警寧澤约郁,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站但两,受9級特大地震影響鬓梅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜谨湘,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一绽快、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧紧阔,春花似錦坊罢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至乖仇,卻和暖如春憾儒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背乃沙。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工起趾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人警儒。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓阳掐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親冷蚂。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

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