作者: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逐漸顯示