iOS繪圖之CALayer、遮罩、CAShapeLayer

作者:Love@YR
鏈接:http://blog.csdn.net/jingqiu880905/article/details/51860530
請尊重原創,謝謝!

demo地址
CALayer是屬於QuartzCore裏的,CA代表CoreAnimation
CGLayer則是屬於CoreGraphics裏的。上上篇文章介紹過5個Graphics Context。
系統提供的其他常用的CALayer有:CAShapeLayer,CAGradientLayer(漸變層),CAReplicatorLayer,CATextLayer等。
1. 先說下CALayer的bounds,position,anchorpoint關係:

    UIButton * _maskButton = [[UIButton alloc] init];
    [_maskButton setFrame:CGRectMake(30, 50, 100, 100)];
    // [_maskButton setFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)];
    [_maskButton setBackgroundColor:[UIColor colorWithWhite:0 alpha:0.7]];

    UIBezierPath *path1 = [UIBezierPath bezierPathWithRect:CGRectMake(-25, 200, 180, 100)];//矩形,-25+30=5 所以距離屏幕左部5
    [path1 appendPath:[UIBezierPath bezierPathWithArcCenter:CGPointMake(SCREEN_WIDTH / 2-30, SCREEN_HEIGHT/2-50) radius:100 startAngle:M_PI endAngle:2*M_PI clockwise:YES]];//圓弧,NO爲逆時針畫。默認順時針,angel爲0的位置在最右邊,如果設置成NO之後,不管fillRule爲什麼相交處都是透明的!!(當然如果其後面有layer就顯示那個layer的透明度)-30是因爲_maskButton.layer從30開始

    CAShapeLayer *shapeLayer1 = [CAShapeLayer layer];
    shapeLayer1.lineWidth = 5;
    shapeLayer1.strokeColor = [UIColor colorWithWhite:0 alpha:0.9].CGColor;

//    [shapeLayer1 setFillRule:kCAFillRuleEvenOdd];
    shapeLayer1.fillColor = [UIColor colorWithWhite:0 alpha:0.3].CGColor;

    shapeLayer1.path = path1.CGPath;

    [_maskButton.layer addSublayer:shapeLayer1];
    [self.placeholderview.layer setMask:_maskButton.layer];//設置self.view.layer的遮罩層

maskLayer不一定要和其想要控制的原layer大小一樣大(不過一般都是一樣大的),這裏self.placeholderview是一個有色的和self.view同樣大小的view,而_maskButton只有100*100

maskLayer add的sublayer即使超過了此maskLayer的範圍也會正常顯示
(這是因爲默認情況下設置的layer的masksToBounds爲NO也即其sublayer超出部分正常顯示,UIView的clipsToBounds默認也是NO的即其subview超出自己範圍的部分也正常顯示,設置YES則只顯示沒超出的部分!!!)

maskLayer和shapeLayer1的範圍控制着self.placeholderview顯示的範圍
maskLayer的透明度,shapeLayer1的strokeColor,fillColor的透明度都決定了其所繪區域的self.placeholderview的透明度。而其他區域的self.placeholderview全部透明即不顯示!!
3. [self.view.layer setMask:maskLayer];
如果一個layer是其他layer的遮罩層,其上的顏色(如:strokecolor、fillcolor)色值全部失效,只透明度有用
[self.view.layer addSublayer:someLayer];
如果一個layer是被add到非遮罩層的層中,顏色正常顯示
[maskLayer addSublayer:someLayer];
被add到遮罩層中,顏色色值失效,顏色的透明度有用。
4. CAShapeLayer加入到masklayer中或者作爲某個layer的masklayer
-當layer setFillRule:kCAFillRuleEvenOdd時
同一個UIBezierPath對象路線相交的部分原layer(要被mask的layer)透明顯示即不顯示。
kCAFillRuleEvenOdd的註釋說:
If the number of crossings is odd, the point is inside the path and the region containing it should be filled.
比如一個view背景色綠色,一個shapelayer的path先是畫了個框,然後又畫了個和此框有相交的框,此shapelayer的fillcolor爲紫色,如果這個shapelayer的fillrule爲奇偶,相交部分透明,則顯示出了view的顏色即綠色。因爲相交部分的點發出射線與path有偶數個交點,所以不需fill。
實驗中發現當圓和框相交時,圓逆時針畫的話即closewise爲no的時候,不管fillrule是什麼都會使得相交處透明顯示。不知道爲何。

深入瞭解CAShapeLayer 和mask可參考:
http://www.cnblogs.com/Phelthas/p/4643400.html
http://www.cnblogs.com/Phelthas/p/4892854.html
http://www.cnblogs.com/Phelthas/p/4801889.html
其中最後一篇就利用了maskLayer先設置width爲0,使得maskLabel完全不顯示,然後改變maskLayer的寬度,使得後面的maskLabel逐漸顯示

發佈了56 篇原創文章 · 獲贊 28 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章