CoreGraphic&UIBezierPath绘图比较

CoreGraphic&UIBezierPath绘图比较

CoreGraphic框架提供了面向C语言风格的绘图API,而贝塞尔曲线实际是面向OC编程风格的绘图方式,但其实它是对CoreGraphic的封装,下面我向大家展示这两种绘图方式:

CoreGraphic绘图

/**
 使用CoreGraphic来绘制
 */
- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();

    // 1、起点
    CGContextMoveToPoint(context, 150.f, 350.f);

    // 2、终点并设置圆弧
    CGContextAddArc(context, 200.f, 350.f, 50.f, 0, M_PI, YES);

    // 3、设置渲染属性
    [[UIColor blackColor] setFill]; // 填充色
    [[UIColor redColor] setStroke]; // 线条颜色

    CGContextSetLineWidth(context, 5.f); // 线宽

    // 4、开始渲染
    CGContextStrokePath(context); // 渲染路径
    CGContextFillPath(context); // 填充
}

使用CoreGraphic绘图一个最重要的概念—图形上下文CGContext,图形上下文是一个比较抽象的概念,可以理解为绘图环境,它包括了绘图需要的信息以及最后的输出,在UIView的drawRect:方法里UIKit会默认创建一个上下文对象,可以通过UIGraphicsGetCurrentContext来获得,当然也可以自己新建一个,具体的可以参考官方介绍Quartz 2D Programming Guide

UIBezierPath绘图

    UIBezierPath *path = [UIBezierPath new];

    // 1、起点
    [path moveToPoint:CGPointMake(150.f, 350.f)];

    // 2、终点并设置圆弧
    [path addArcWithCenter:CGPointMake(200.f, 350.f) radius:50.f startAngle:0 endAngle:M_PI clockwise:YES];

    // 3、设置渲染属性
    [[UIColor blackColor] setFill]; // 填充色
    [[UIColor redColor] setStroke]; // 线条颜色

    path.lineWidth = 5.f;

    // 4、开始渲染
    [path stroke]; // 渲染路径
    [path fill]; // 填充

可以看出,贝塞尔曲线实际上是对CoreGraphic的封装,上面只是列举了绘图中的一种,还有很多诸如绘制椭圆、矩形、三角形、环等方法,常见的绘图软件也是基于它们的。

绘图比较

下面是两种方式最终的绘制结果:
这里写图片描述
从上图可以看出,绘图环境相同(主要指的是绘图需要的环境参数,包括坐标点、颜色和线宽)但是最终呈现的结果却不相同,那是什么原因导致的呢?
原因在于iOS中的坐标体系是和Quartz坐标体系中Y轴相反的,所以iOS UIView在做Quartz绘图时,Y轴已经做了Scale为-1的转换,因此造成CGPathAddArc函数最后一个是否是顺时针的参数结果正好是相反的,也就是说如果设置最后的参数为YES,根据参数定义应该是顺时针的,但实际绘图结果会是逆时针的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值