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 );
定义一个回调函数可以查看在图形路径中的元素。