Core Graphics路径CGPath

        CGPath图形路径是对一系列形状或线的数学描述。 CGPathRef定义了一个不可变的图形路径的类型,CGMutablePathRef定义了一个可变的图形的路径的类型。无论是CGPathRef或者CGMutablePathRef,都不能定义绘制路径的函数。要绘制Quartz路径需要使用图形上下文,通过调用CGContextAddPath将路径添加到图形上下文中去,然后调用的图形上下文的绘图功能,可以参考CGContext类的相关内容。

        路径定了一个或多个形状,或是子路径。一个子路径可由直线,曲线,或者同由两者构成。它可以是开放的,也可以是合的。一个子路径可以是简单的形状,如线、矩形、星形;也可以是复的形状,如山脉的廓或者是涂

        要追加新的子路径到一个可变的路径,你的应用程序通常可以调用CGPathMoveToPoint设置子路径的出发点,随后进行了一系列的CGPathAdd*函数调用来继续绘制路径添加到子路径。你的应用程序可以调用CGPathCloseSubpath来明确关闭子路径绘制。

        通常,绘制流程是:

1.创建路径对象:CGPathRef/CGMutablePathRef;

2.设置路径或图形;

3.建立图形上下文;

4.将路径添加到图形上下文中去;

5.绘制;

6.释放路径。


- (void)drawTwoLines
{
    CGRect screenRect = [[UIScreen mainScreen] bounds];
    
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathMoveToPoint(path, NULL, screenRect.origin.x, screenRect.origin.y);
    CGPathAddLineToPoint(path, NULL, screenRect.size.width, screenRect.size.height);
    CGPathMoveToPoint(path, NULL, screenRect.size.width, screenRect.origin.y);
    CGPathAddLineToPoint(path, NULL, screenRect.origin.x, screenRect.size.height);
    
    
    CGPathMoveToPoint(path,NULL,75,10);
    CGPathAddLineToPoint(path,NULL,10,150);
    CGPathAddLineToPoint(path,NULL,160,150);
    
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextAddPath(context, path);//将路径添加到上下文中去
    CGContextSetLineWidth(context, 1.0f);
    [[UIColor blueColor] setStroke];
    CGContextDrawPath(context, kCGPathStroke);      //第二个参数为画路径的样式,这里为描线,也可以有填充或者既描线也填充   绘制
    
    CGPathRelease(path);//释放路径
}



数据类型:

struct CGPathElement { CGPathElementType type; CGPoint * points; }; typedef struct CGPathElement CGPathElement;
        一种数据结构,提供了有关一个路径元素的信息。

typedef const struct CGPath *CGPathRef;
        不可变路径对象。

typedef struct CGPath *CGMutablePathRef;
        可变路径对象。

常量:

enum CGPathDrawingMode {
   kCGPathFill,
   kCGPathEOFill,
   kCGPathStroke,
   kCGPathFillStroke,
   kCGPathEOFillStroke 
};
typedef enum CGPathDrawingMode CGPathDrawingMode;

        填充方式(即绘制模式)。

        kCGPathFill:只有填充(非零缠绕数填充),不绘制边框

        kCGPathEOFill:奇偶规则填充(多条路径交叉时,奇数交叉填充,偶交叉不填充)

        kCGPathStroke:只有边框

        kCGPathFillStroke:既有边框又有填充

        kCGPathEOFillStroke:奇偶填充并绘制边框

enum CGPathElementType {
   kCGPathElementMoveToPoint,
   kCGPathElementAddLineToPoint,
   kCGPathElementAddQuadCurveToPoint,
   kCGPathElementAddCurveToPoint,
   kCGPathElementCloseSubpath 
};
typedef enum CGPathElementType CGPathElementType;
        路径元素类型。

enum CGLineCap {
   kCGLineCapButt,
   kCGLineCapRound,
   kCGLineCapSquare 
};
typedef enum CGLineCap CGLineCap;
        线边帽的三种类型。

enum CGLineJoin {
   kCGLineJoinMiter,
   kCGLineJoinRound,
   kCGLineJoinBevel 
};
typedef enum CGLineJoin CGLineJoin;
        线段拐角出设置的三种类型,kCGLineJoinMiter(直角), kCGLineJoinRound(圆角), kCGLineJoinBevel(平角)。

创建和管理路径:

CGMutablePathRef CGPathCreateMutable ( void );
        创建一个可变路径,你需要负责释放该对象。

CGPathRef CGPathCreateWithEllipseInRect ( CGRect rect, const CGAffineTransform *transform );

        创建一个不可变的椭圆路径。

CGPathRef CGPathCreateWithRect ( CGRect rect, const CGAffineTransform *transform );
        创建一个不可变的路径。

CGPathRef CGPathCreateWithRoundedRect ( CGRect rect, CGFloat cornerWidth, CGFloat cornerHeight, const CGAffineTransform *transform );
        创建一个不可变的圆角矩形。

CGPathRef CGPathCreateCopy ( CGPathRef path );
        创建一个不可变的可以拷贝的路径。

CGPathRef CGPathCreateCopyByTransformingPath ( CGPathRef path, const CGAffineTransform *transform );
         由一个 转换矩阵变换一个图形路径创建一个不可变的副本。
CGPathRef CGPathCreateCopyByDashingPath ( CGPathRef path, const CGAffineTransform *transform, CGFloat phase, const CGFloat *lengths, size_t count );
        创建一个可复制的虚线路径。

CGPathRef CGPathCreateCopyByStrokingPath ( CGPathRef path, const CGAffineTransform *transform, CGFloat lineWidth, CGLineCap lineCap, CGLineJoin lineJoin, CGFloat miterLimit );
        创建另一个路径的副本。
CGMutablePathRef CGPathCreateMutableCopy ( CGPathRef path );
        创建一个现有的可变路径的副本。

CGMutablePathRef CGPathCreateMutableCopyByTransformingPath ( CGPathRef path, const CGAffineTransform *transform );
        创建 一个由一个 转换 阵变换 一个 形路径的可 副本。

void CGPathRelease ( CGPathRef path );
        递减路径对象的引用计数。

CGPathRef CGPathRetain ( CGPathRef path );
        增加路径对象的引用计数。

修改Quartz路径:

void CGPathAddArc ( CGMutablePathRef path, const CGAffineTransform *m, CGFloat x, CGFloat y, CGFloat radius, CGFloat startAngle, CGFloat endAngle, bool clockwise );
        将一个弧加入可变路径中。

void CGPathAddRelativeArc ( CGMutablePathRef path, const CGAffineTransform *matrix, CGFloat x, CGFloat y, CGFloat radius, CGFloat startAngle, CGFloat delta );
        将一个弧加入可变路径中。

void CGPathAddArcToPoint ( CGMutablePathRef path, const CGAffineTransform *m, CGFloat x1, CGFloat y1, CGFloat x2, CGFloat y2, CGFloat radius );
        将一个弧加入可变路径中。

void CGPathAddCurveToPoint ( CGMutablePathRef path, const CGAffineTransform *m, CGFloat cp1x, CGFloat cp1y, CGFloat cp2x, CGFloat cp2y, CGFloat x, CGFloat y );
        将一个贝塞尔曲线加入到可变路径中去。

void CGPathAddLines ( CGMutablePathRef path, const CGAffineTransform *m, const CGPoint points[], size_t count );
        根据数组里的点,连续绘制路径。

void CGPathAddLineToPoint ( CGMutablePathRef path, const CGAffineTransform *m, CGFloat x, CGFloat y );
        绘制直线路径。

void CGPathAddPath ( CGMutablePathRef path1, const CGAffineTransform *m, CGPathRef path2 );
         为可变路径添加路径。

void CGPathAddQuadCurveToPoint ( CGMutablePathRef path, const CGAffineTransform *m, CGFloat cpx, CGFloat cpy, CGFloat x, CGFloat y );
        为一个可变路径添加一个二次贝赛尔曲线。

void CGPathAddRect ( CGMutablePathRef path, const CGAffineTransform *m, CGRect rect );
        绘制矩形。
void CGPathAddRects ( CGMutablePathRef path, const CGAffineTransform *m, const CGRect rects[], size_t count );
        根据数组里的数据绘制矩形组。

void CGPathAddRoundedRect ( CGMutablePathRef path, const CGAffineTransform *transform, CGRect rect, CGFloat cornerWidth, CGFloat cornerHeight );
        绘制圆角矩形。

void CGPathApply ( CGPathRef path, void *info, CGPathApplierFunction function );
        对于路径中的指定元素,调用指定函数。

void CGPathMoveToPoint ( CGMutablePathRef path, const CGAffineTransform *m, CGFloat x, CGFloat y );
        在指定位置绘制起点。

void CGPathCloseSubpath ( CGMutablePathRef path );
        关闭并完成一个可变路径中的子路经。

void CGPathAddEllipseInRect ( CGMutablePathRef path, const CGAffineTransform *m, CGRect rect );
        添加一个适合的 椭圆 在矩形的内部。


获取有关Quartz路径:

bool CGPathEqualToPath ( CGPathRef path1, CGPathRef path2 );
        判断两个路径是否相等。

CGRect CGPathGetBoundingBox ( CGPathRef path );
         返回一个包含所有点在图形路径的边框

CGRect CGPathGetPathBoundingBox ( CGPathRef path );
        返回图形路径的边界框。

CGPoint CGPathGetCurrentPoint ( CGPathRef path );
        返回路径中的点。

CFTypeID CGPathGetTypeID ( void );
        返回 Quartz 图形路径的核心基础类型的标识符。

bool CGPathIsEmpty ( CGPathRef path );
         判断路径是否为空。

bool CGPathIsRect ( CGPathRef path, CGRect *rect );
        路径是否是一个矩形。

bool CGPathContainsPoint ( CGPathRef path, const CGAffineTransform *m, CGPoint point, bool eoFill );
        检测一个点是否在路径中。


其他回调:

typedef void (*CGPathApplierFunction) ( void *info, const CGPathElement *element );
        定义一个回调函数可以查看在图形路径中的元素。





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值