美文网首页iOS开发常用知识点
UIBezierPath贝塞尔曲线画圆的三种方式

UIBezierPath贝塞尔曲线画圆的三种方式

作者: 鄂北 | 来源:发表于2020-04-25 23:47 被阅读0次

    方法一

    在当前的控制器中直接加入下面代码

        CAShapeLayer *layer = [CAShapeLayer new];
        layer.lineWidth = 10;
        //圆环的颜色
        layer.strokeColor = [UIColor redColor].CGColor;
        //背景填充色
        layer.fillColor = [UIColor clearColor].CGColor;
        //设置半径为100
        CGFloat radius = 100;
        //按照顺时针方向
        BOOL clockWise = true;
        //初始化一个路径
        UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:self.view.center radius:radius startAngle:(0) endAngle:M_PI*2 clockwise:clockWise];
        layer.path = [path CGPath];
        [self.view.layer addSublayer:layer];
    

    这个上面的方法中创建UIBezierPath有几个参数需要注意下

    UIBezierPath * path = [UIBezierPath bezierPathWithArcCenter:<#(CGPoint)#> radius:<#(CGFloat)#> startAngle:<#(CGFloat)#> endAngle:<#(CGFloat)#> clockwise:<#(BOOL)#>];
    

    第一个ArcCenter弧度的中心,其类型是CGPoint
    radius弧度的半径
    startAngle开始角度
    endAngle结束角度
    clockwise是否顺时针
    NOTE:贝塞尔曲线只是规划了一个Layer的路径,而不能真正的展示出来,所以要和CAShapeLayer搭配使用
    参考:iOS贝塞尔曲线画圆

    方法二

    利用UIView中drawRect去绘制UIBezierPath画圆。由于UIBezierPath在控制器中不能直接绘制出来,那么我们可以建一个UIView的子类,在UIView的子类中通过重写drawRect方法去绘制UIBezierPath贝赛尔曲线。方法如下

    - (void)drawRect:(CGRect)rect {
        // Drawing code
        [self drawCircleMethodOne];
    }
    
    - (void)drawCircleMethodOne
    {
        UIBezierPath * path = [[UIBezierPath alloc] init];
        [path addArcWithCenter:CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds)) radius:50 startAngle:0.0 endAngle:M_PI*2.0 clockwise:YES];
        path.lineWidth = 3;
        [[UIColor yellowColor] setStroke];
        [path stroke];
    }
    

    初始化UIBezierPath跟方法一是一样的,可以去看方法一的讲解。

    这句是设置曲线的颜色

    [[UIColor yellowColor] setStroke];
    

    最后得加上这句,贝赛曲线才会绘制

    [path stroke];
    

    方法三

    这方法也是在drawRect进行绘制的

    - (void)drawRect:(CGRect)rect {
        // Drawing code
        [self drawCircleMethodTwo];
    }
    
    - (void)drawCircleMethodTwo
    {
        
        //线条颜色
    
        UIColor *color = [UIColor orangeColor];
    
        [color set];
    
        //绘制圆形
        
        UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(4, 100, 150, 150)];
    
        //设置线宽
    
        path.lineWidth = 8;
    
        //线条拐角
    
        path.lineCapStyle = kCGLineCapRound;
    
        //终点处理
    
        path.lineJoinStyle = kCGLineJoinRound;
    
        //根据坐标点连线
    
        [path stroke];
    
    }
    

    drawRect的知识点

    drawRect介绍
    drawRect是UIView类的一个方法,在drawRect中所调用的重绘功能是基于Quartz 2D实现的,Quartz 2D是一个二维图形绘制引擎,支持iOS环境和Mac OS X环境。利用UIKit框架提供的控件,我们能实现一些简单的UI界面,但是,有些UI界面比较复杂,用普通的UI控件无法实现,或者实现效果不佳,这时可以利用Quartz 2D技术将控件内部的结构画出来,自定义所需控件,这也是Quartz 2D框架在iOS开发中一个很重要的价值。

    • 我们只能在继承了UIView的子类中通过重写drawRect方法来绘制图形。
    • 如果需要绘制图形的子类直接继承自UIView,则子类的drawRect方法中不需要调用父类方法[super drawRect:rect];。如果子类继承自其他继承UIView的View类,则drawRect方法中需要调用父类方法[super drawRect:rect];。
    • drawRect方法不能手动直接调用,我们可以通过调用其他方法来实现drawRect方法的调用。如:在子类初始化时调用- (instancetype)initWithFrame:(CGRect)frame方法,且frame不为CGRectZero时。
    • 我们可以调用setNeedsDisplay()方法或setNeedsDisplayInRect方法,但是该方法不会自己调用drawRect方法,而是会标记视图,并在下一次循环更新的时候让视图通过drawRect来进行重绘,前提是rect不为CGRectZero。

    CAShapeLayer绘图与drawRect重绘的比较
    (1)两种自定义控件样式的方法各有优缺点,CAShapeLayer配合贝赛尔曲线使用时,绘图形状更灵活,而drawRect只是一个方法而已,在其中更适合绘制大量有规律的通用的图形;
    (2)CALayer的属性变化默认会有动画,drawRect绘图没有动画;
    (3)CALayer绘制图形是实时的,drawRect多次重绘需要手动调用setNeedsLayout;
    (4)性能方面,CAShapeLayer使用了硬件加速,绘制同一图形会比用Core Graphics快很多,CAShapeLayer属于CoreAnimation框架,动画渲染直接提交给手机GPU,不消耗内,而Core Graphics会消耗大量的CPU资源。

    参考
    聊聊iOS drawRect那点事儿
    iOS利用drawRect方法绘制图形

    相关文章

      网友评论

        本文标题:UIBezierPath贝塞尔曲线画圆的三种方式

        本文链接:https://www.haomeiwen.com/subject/gqnlwhtx.html