專用圖層
CAShapLayer是一個(gè)通過矢量圖形而不是bitmap來繪制的圖層子類。你指定諸如顏色和線寬等屬性,用CGPath來定義想要繪制的圖形,最后CAShapeLayer就自動(dòng)渲染出來了。當(dāng)然,你也可以用CoreGraphics直接向原始的CALayer的內(nèi)容中繪制一個(gè)路徑,相比之下,使用CAShapLayer有以下一些有點(diǎn):
- 渲染快速。
CAShapeLayer使用了硬件加速,繪制同一圖形會(huì)比用Core Graphics快很多。 - 高效使用內(nèi)存。一個(gè)
CAShapeLayer不需要像普通CALayer一樣創(chuàng)建一個(gè)寄宿圖形,所以無論有多大,都不會(huì)占用太多的內(nèi)存。 - 不會(huì)被圖層邊界才剪掉。一個(gè)
CAShapeLayer可以在邊界之外繪制。你的圖層路徑不會(huì)像在使用Core Graphics的普通CALayer一樣被裁剪掉。 - 不會(huì)出現(xiàn)像素化。當(dāng)你給
CAShapeLayer做3D變換時(shí),它不像一個(gè)有寄宿圖的普通圖層一樣變得像素化。
創(chuàng)建一個(gè)CGPath
CAShapeLayer可以用來繪制所有能夠通過CGPath來表示的形狀。這個(gè)形狀不一定要閉合,圖層路徑也不一定要不可破,事實(shí)上你可以在一個(gè)圖層上繪制好幾個(gè)不同的形狀。你可以控制一些屬性比如lineWidth(線寬,用點(diǎn)表示單位),lineCap(線條結(jié)尾的樣子),和lineJoin(線條之間的結(jié)合點(diǎn)的樣子);但是在圖層層面你只有一次機(jī)會(huì)設(shè)置這些屬性。如果你想有不同顏色或風(fēng)格來繪制多個(gè)形狀,就不得不為每個(gè)形狀準(zhǔn)備一個(gè)圖層了。
`
UIBezierPath *path = [[UIBezierPath alloc] init];
[path moveToPoint:CGPointMake(175, 100)];
[path addArcWithCenter:CGPointMake(150, 100) radius:25 startAngle:0 endAngle:2*M_PI clockwise:YES];
[path moveToPoint:CGPointMake(150, 125)];
[path addLineToPoint:CGPointMake(150, 175)];
[path addLineToPoint:CGPointMake(125, 225)];
[path moveToPoint:CGPointMake(150, 175)];
[path addLineToPoint:CGPointMake(175, 225)];
[path moveToPoint:CGPointMake(100, 150)];
[path addLineToPoint:CGPointMake(200, 150)];
CAShapeLayer *shapeLayer = [CAShapeLayer layer];
shapeLayer.strokeColor = [UIColor redColor].CGColor;
shapeLayer.fillColor = [UIColor clearColor].CGColor;
shapeLayer.lineWidth = 5;
shapeLayer.lineJoin = kCALineJoinRound;
shapeLayer.lineCap = kCALineCapRound;
shapeLayer.path = path.CGPath;
[self.shapeView.layer addSublayer:shapeLayer];
`
代碼效果:

圓角
CAShapeLayer為創(chuàng)建圓角視圖提供了一個(gè)方法,就是CALayer的CornerRadius屬性。雖然使用CAShapeLayer類需要更多的工作,但是它有一個(gè)優(yōu)勢就是可以單獨(dú)指定每個(gè)角。
我們創(chuàng)建圓角矩形其實(shí)就是人工繪制單獨(dú)的直線和弧度,但是事實(shí)上UIBezierPath有自動(dòng)繪制圓角矩形的構(gòu)造方法,下面這段代碼繪制了一個(gè)有三個(gè)圓角一個(gè)直角的矩形:
`
CGRect rect = CGRectMake(50, 50, 100, 100);
CGSize radii = CGSizeMake(20, 20);
UIRectCorner corners = UIRectCornerTopRight|UIRectCornerBottomRight|UIRectCornerBottomLeft;
UIBezierPath *path2 = [UIBezierPath bezierPathWithRoundedRect:rect byRoundingCorners:corners cornerRadii:radii];
我們可以通過這個(gè)圖層路徑繪制一個(gè)既有直角又有圓角的視圖。如果我們想依照此圖形來裁剪試圖內(nèi)容,我們可以把CAShapeLaye作為視圖的宿主圖層,而不是添加一個(gè)字視圖。