如何对UIView可控制性的圆角

默认情况下,我们可以通过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]; 

效果:

Simulator Screen Shot Feb 15, 2016, 14.42.00.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,228评论 4 61
  • 邮轮旅游诞生已超过百年,从一种奢华、风靡上流社会的出行方式逐渐走向平民化。 2006年,嘉年华集团旗下诗歌达邮轮“...
    常旅达人阅读 5,182评论 1 0
  • 看着学校新来实习的妹妹们,她们都20左右的年纪,青春活力,有自己的个性,有自己的方向,所以最近我也时常回忆过去...
    不合适又放不下的梗阅读 929评论 0 2
  • 文/尘间红叶 01 傍晚时分,天色有些暗沉,厚厚的云层里悄悄酝酿着一场雨。我提议去隔壁的大学南苑走走,儿子说,现在...
    尘间红叶阅读 3,982评论 9 8