贝塞尔曲线画圆角气泡.md

当遇到圆角气泡时可以通过UIBezierPathCAShapeLayermask来实现对一个矩形视图的裁剪从而实现圆角气泡效果

image.png

首先要有一个矩形视图,初始状态应该是这样的

image4.png

接下来在这个视图上开始用贝赛尔曲线画出来想要的图形,大概的示意图应该是这样的曲线

image2.png

接下来就是

  1. 用贝塞尔曲线画出来上面的曲线
  2. 将曲线路径给CAShapeLayer来根据曲线path来显示裁剪一个layer
  3. 将这个layer作为view的mask来遮罩
    CGFloat corner = 5;
    CGFloat bottomMargin = 5;
    CGFloat arrowWidth = 5;
    
    UIBezierPath *path = [UIBezierPath bezierPath];
    path.lineJoinStyle = kCGLineJoinRound;
    
    [path moveToPoint:CGPointMake(corner, 0)];
    [path addQuadCurveToPoint:CGPointMake(0, corner) controlPoint:CGPointMake(0, 0)];
    [path addLineToPoint:CGPointMake(0, processInfoViewHeight-bottomMargin-corner)];
    [path addQuadCurveToPoint:CGPointMake(corner, processInfoViewHeight-bottomMargin) controlPoint:CGPointMake(0, processInfoViewHeight-bottomMargin)];
    [path addLineToPoint:CGPointMake(processInfoViewWidth/2-arrowWidth/2, processInfoViewHeight-bottomMargin)];
    [path addLineToPoint:CGPointMake(processInfoViewWidth/2, processInfoViewHeight)];
    [path addLineToPoint:CGPointMake(processInfoViewWidth/2+arrowWidth/2, processInfoViewHeight-bottomMargin)];
    [path  addLineToPoint:CGPointMake(processInfoViewWidth-corner, processInfoViewHeight-bottomMargin)];
    [path addQuadCurveToPoint:CGPointMake(processInfoViewWidth, processInfoViewHeight-bottomMargin-corner) controlPoint:CGPointMake(processInfoViewWidth, processInfoViewHeight-bottomMargin)];
    [path addLineToPoint:CGPointMake(processInfoViewWidth, corner)];
    [path addQuadCurveToPoint:CGPointMake(processInfoViewWidth-corner, 0) controlPoint:CGPointMake(processInfoViewWidth, 0)];
    [path closePath];
    
    CAShapeLayer *shapeLayer = [CAShapeLayer layer];
    shapeLayer.frame = processInfoView.bounds;
    shapeLayer.path = path.CGPath;
    
    processInfoView.layer.mask = shapeLayer;

有几个注意点,我在第一次做的时候出现了下面的情况


image3.png

把需要显示的部分镂空了。

之所以会出现这样的情况是因为
我在用UIBezierPath的初始化方法时用错了。我把路径初始化时用的是这样的

UIBezierPath *path = [UIBezierPath bezierPathWithRect:processInfoView.bounds]

这样的话,初始化就给了一个路径,后面的曲线path和这个初始化出来的叠加起来了。

而path有一个属性是fillRule这个属性的默认值是FillRuleEvenOdd。EvenOdd是一个奇偶规则,奇数则显示,偶数不显示。当两条路径叠加在一起的时候。所以不显示。

关于mask,他就是一个layer,这个layer的透明度决定了layer的显示。不透明的内容可以显示,透明的不显示

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

推荐阅读更多精彩内容

  • 转载:http://www.jianshu.com/p/32fcadd12108 每个UIView有一个伙伴称为l...
    F麦子阅读 11,503评论 0 13
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,276评论 4 61
  • 小伙伴们,你曾有过这样的困惑吗? 下班音乐响起的时候,回想这一天,一直忙忙碌碌,却感觉并没有做好几件事? 每每这样...
    我有一个梦想1025阅读 2,472评论 0 0
  • 【禅语】 “走自己的路,让别人去说吧!”可多少人最后终究还是选择了他人眼中最“合情合理”的路线,而这是否又是自己...
    武汉如心阅读 2,801评论 0 2
  • 片段 二: 选自《非暴力沟通》 【R 原文片段】 非暴力沟通第二个要素是感受。心理学家罗洛.梅认为”成熟的人十分敏...
    林小烧卖阅读 799评论 0 0