默认情况下,我们可以通过self.view.layer.cornerRadius = 20
设置圆角,但是这种方式会对四个角都有影响,那么我们是否可以控制性的对某些角(如左上、右下等)设置呢?如果可行,如何操作呢?
其实在苹果近乎完美的SDK下是完全可以实现的,这里我们只需要知道3个概念即可:
1、CAShapeLayer
2、UIBezierPath
3、mask
CAShapeLayer是Core Animation世界下CALayer的子类,它最大的好处是可以绘制不规则的形状,当然CALayer也是可以的,但是CAShapeLayer相比CALayer有较多的好处:
A、渲染快速,它使用了硬件加速
B、高效使用内存,它未使用寄宿图形(contens)
C、不会出现像素化
...
UIBezierPath是CGPath的Objective-C化,它完全面向对象化,我们可以比较方便的使用它创建任意形状。其中UIBezierPath有一个函数可以使某个矩形可控制性的圆角:bezierPathWithRoundedRect
CALayer有一个属性mask
,它的类型也是CALayer。给定layer一个mask layer,那么原有的layer就会按mask layer的轮廓进行截取(按轮廓截取其实又可总结一篇文章,下次再说!)。
以上3个概念足以完成我们对圆角可控制性的操作了,代码如下:
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];
效果: