默認(rèn)情況下,我們可以通過(guò)self.view.layer.cornerRadius = 20設(shè)置圓角,但是這種方式會(huì)對(duì)四個(gè)角都有影響,那么我們是否可以控制性的對(duì)某些角(如左上、右下等)設(shè)置呢?如果可行,如何操作呢?
其實(shí)在蘋果近乎完美的SDK下是完全可以實(shí)現(xiàn)的,這里我們只需要知道3個(gè)概念即可:
1、CAShapeLayer
2、UIBezierPath
3、mask
CAShapeLayer是Core Animation世界下CALayer的子類,它最大的好處是可以繪制不規(guī)則的形狀,當(dāng)然CALayer也是可以的,但是CAShapeLayer相比CALayer有較多的好處:
A、渲染快速,它使用了硬件加速
B、高效使用內(nèi)存,它未使用寄宿圖形(contens)
C、不會(huì)出現(xiàn)像素化
...
UIBezierPath是CGPath的Objective-C化,它完全面向?qū)ο蠡?,我們可以比較方便的使用它創(chuàng)建任意形狀。其中UIBezierPath有一個(gè)函數(shù)可以使某個(gè)矩形可控制性的圓角:bezierPathWithRoundedRect
CALayer有一個(gè)屬性mask,它的類型也是CALayer。給定layer一個(gè)mask layer,那么原有的layer就會(huì)按mask layer的輪廓進(jìn)行截取(按輪廓截取其實(shí)又可總結(jié)一篇文章,下次再說(shuō)?。?。
以上3個(gè)概念足以完成我們對(duì)圓角可控制性的操作了,代碼如下:
swift:
let shapeLayer = CAShapeLayer()
let rect = self.imageView.bounds
let radii = CGSizeMake(20, 20)
let path = UIBezierPath.init(roundedRect: rect, byRoundingCorners: [UIRectCorner.TopLeft, UIRectCorner.BottomLeft, UIRectCorner.TopRight], cornerRadii: radii)
shapeLayer.path = path.CGPath
self.imageView.layer.mask = shapeLayer
objc(核心代碼,其他參考swift版本):
CGRect rect = CGRectMake(50, 50, 100, 100);
CGSize radii = CGSizeMake(20, 20);
UIRectCorner corners = UIRectCornerTopRight | UIRectCornerBottomRight | UIRectCornerBottomLeft;
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:rect byRoundingCorners:corners cornerRadii:radii];
效果:
