#ifndef CGPATH_H_ #define CGPATH_H_ ForeverGuard博客园 #include <CoreFoundation/CFBase.h> #include <CoreFoundation/CFAvailability.h> #include <stdint.h> typedef struct CF_BRIDGED_TYPE(id) CGPath *CGMutablePathRef; typedef const struct CF_BRIDGED_TYPE(id) CGPath *CGPathRef; #include <CoreGraphics/CGBase.h> #include <CoreGraphics/CGAffineTransform.h> #include <CoreFoundation/CFBase.h> CF_IMPLICIT_BRIDGING_ENABLED CF_ASSUME_NONNULL_BEGIN /* Line join styles. */ typedef CF_ENUM(int32_t, CGLineJoin) { kCGLineJoinMiter, kCGLineJoinRound, kCGLineJoinBevel }; /* Line cap styles. */ typedef CF_ENUM(int32_t, CGLineCap) { kCGLineCapButt, kCGLineCapRound, kCGLineCapSquare }; /*CFTypeID CGPath类在CoreGraphics框架中的唯一标识 */ CG_EXTERN CFTypeID CGPathGetTypeID(void) CG_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_2_0); /* 创建一个srtuct CGPath * 指针 ,可变的CGPath类*/ CG_EXTERN CGMutablePathRef CGPathCreateMutable(void) CG_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_2_0); /* 通过一个CGPathRef创建CGPathRef. */ CG_EXTERN CGPathRef __nullable CGPathCreateCopy(CGPathRef cg_nullable path) CG_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_2_0); /* 通过创建CGPathRef得到的路径进行transform矩阵变换后返回 */ CG_EXTERN CGPathRef __nullable CGPathCreateCopyByTransformingPath( CGPathRef cg_nullable path, const CGAffineTransform * __nullable transform) CG_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0); /* 通过CGPathRef创建可变的CGMutablePathRef */ CG_EXTERN CGMutablePathRef __nullable CGPathCreateMutableCopy( CGPathRef cg_nullable path) CG_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_2_0); /* 通过创建CGMutablePathRef得到的路径进行transform矩阵变换后返回 */ CG_EXTERN CGMutablePathRef __nullable CGPathCreateMutableCopyByTransformingPath( CGPathRef cg_nullable path, const CGAffineTransform * __nullable transform) CG_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0); /* 创建矩形路径,第一个参数绘制的矩形区域 第二个参数进行transform矩阵变换 */ CG_EXTERN CGPathRef CGPathCreateWithRect(CGRect rect, const CGAffineTransform * __nullable transform) CG_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_4_0); /* 创建椭圆形路径 第一个参数绘制的区域 第二个参数进行transform矩阵变换 */ CG_EXTERN CGPathRef CGPathCreateWithEllipseInRect(CGRect rect, const CGAffineTransform * __nullable transform) CG_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0); /** 创建圆角矩形路径 @param rect 矩形区域 @param cornerWidth 横向圆角尺寸 @param cornerHeight 纵向圆角尺寸 @param transform 矩阵 */ CG_EXTERN CGPathRef CGPathCreateWithRoundedRect(CGRect rect, CGFloat cornerWidth, CGFloat cornerHeight, const CGAffineTransform * __nullable transform) CG_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_7_0); /** 圆角矩形路径 @param path 可变的CGMutablePathRef @param transform 矩阵 @param rect 矩形区域 @param cornerWidth 横向圆角尺寸 @param cornerHeight 纵向圆角尺寸 */ CG_EXTERN void CGPathAddRoundedRect(CGMutablePathRef cg_nullable path, const CGAffineTransform * __nullable transform, CGRect rect, CGFloat cornerWidth, CGFloat cornerHeight) CG_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_7_0); /** 创建虚线路径 @param path 进行虚化的路径 @param transform 矩阵 @param phase 从lengths数组的第几部分开始绘制 @param lengths C风格数组 {2,4}:表示先绘制实线为长度为2,在绘制空白长度为4 类推 @param count 设置lengths数组的长度 */ CG_EXTERN CGPathRef __nullable CGPathCreateCopyByDashingPath( CGPathRef cg_nullable path, const CGAffineTransform * __nullable transform, CGFloat phase, const CGFloat * __nullable lengths, size_t count) CG_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0); /** 创建斜线 @param path 路径 @param transform 矩阵 @param lineWidth 线宽 @param lineCap 线冒(枚举) @param lineJoin 连接处线的风格(枚举) @param miterLimit 连接处角的锋利程度 typedef CF_ENUM(int32_t, CGLineJoin) { kCGLineJoinMiter, 锋利 kCGLineJoinRound, 圆角 kCGLineJoinBevel 贝塞尔风格 }; typedef CF_ENUM(int32_t, CGLineCap) { kCGLineCapButt, 线冒精确到点(默认) kCGLineCapRound, 线冒为半径为线宽一半的圆弧 kCGLineCapSquare 线冒尖锐的过渡 }; */ CG_EXTERN CGPathRef __nullable CGPathCreateCopyByStrokingPath( CGPathRef cg_nullable path, const CGAffineTransform * __nullable transform, CGFloat lineWidth, CGLineCap lineCap, CGLineJoin lineJoin, CGFloat miterLimit) CG_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0); /* 引用计数+1 */ CG_EXTERN CGPathRef cg_nullable CGPathRetain(CGPathRef cg_nullable path) CG_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_2_0); /* 引用计数-1*/ CG_EXTERN void CGPathRelease(CGPathRef cg_nullable path) CG_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_2_0); /*两个图形路径是否相等*/ CG_EXTERN bool CGPathEqualToPath(CGPathRef cg_nullable path1, CGPathRef cg_nullable path2) CG_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_2_0); /*** Path construction functions. ***/ /* 路径起点 */ CG_EXTERN void CGPathMoveToPoint(CGMutablePathRef cg_nullable path, const CGAffineTransform * __nullable m, CGFloat x, CGFloat y) CG_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_2_0); /* 路径移动到某一点画一条直线 */ CG_EXTERN void CGPathAddLineToPoint(CGMutablePathRef cg_nullable path, const CGAffineTransform * __nullable m, CGFloat x, CGFloat y) CG_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_2_0); /* 向路径中添加一段二次贝塞尔曲线 cpx:控制点的x坐标 cpy:控制点的y坐标 */ CG_EXTERN void CGPathAddQuadCurveToPoint(CGMutablePathRef cg_nullable path, const CGAffineTransform *__nullable m, CGFloat cpx, CGFloat cpy, CGFloat x, CGFloat y) CG_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_2_0); /* 添加一段三次贝塞尔曲线*/ CG_EXTERN void CGPathAddCurveToPoint(CGMutablePathRef cg_nullable path, const CGAffineTransform * __nullable m, CGFloat cp1x, CGFloat cp1y, CGFloat cp2x, CGFloat cp2y, CGFloat x, CGFloat y) CG_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_2_0); /* 闭合路径 最后的终点和起点闭合 */ CG_EXTERN void CGPathCloseSubpath(CGMutablePathRef cg_nullable path) CG_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_2_0); /*** Path construction convenience functions. ***/ /* 向路径中追加一个矩形*/ CG_EXTERN void CGPathAddRect(CGMutablePathRef cg_nullable path, const CGAffineTransform * __nullable m, CGRect rect) CG_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_2_0); /* 向路径中追加一组矩形 */ CG_EXTERN void CGPathAddRects(CGMutablePathRef cg_nullable path, const CGAffineTransform * __nullable m, const CGRect * __nullable rects, size_t count) CG_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_2_0); /* 向路径中追加一组线条 */ CG_EXTERN void CGPathAddLines(CGMutablePathRef cg_nullable path, const CGAffineTransform * __nullable m, const CGPoint * __nullable points, size_t count) CG_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_2_0); /*向路径中追加一组椭圆*/ CG_EXTERN void CGPathAddEllipseInRect(CGMutablePathRef cg_nullable path, const CGAffineTransform * __nullable m, CGRect rect) CG_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_2_0); /*向路径中追加一组圆弧 x:圆心x坐标 y:圆心y坐标 radius:弧线半径 startAngle:起始角度 delta:圆弧绘制的长度 为弧度制 2π为整个圆 */ CG_EXTERN void CGPathAddRelativeArc(CGMutablePathRef cg_nullable path, const CGAffineTransform * __nullable matrix, CGFloat x, CGFloat y, CGFloat radius, CGFloat startAngle, CGFloat delta) CG_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0); /*向路径中追加一组圆弧 x:圆心x坐标 y:圆心y坐标 radius:弧线半径 startAngle:起始角度 endAngle:终止角度 clockwise:是否顺时针绘制 */ CG_EXTERN void CGPathAddArc(CGMutablePathRef cg_nullable path, const CGAffineTransform * __nullable m, CGFloat x, CGFloat y, CGFloat radius, CGFloat startAngle, CGFloat endAngle, bool clockwise) CG_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_2_0); /* 向路径中追加一段圆弧 弧线是以(x1,y1)到(x2,y2)为切线的弧线 */ CG_EXTERN void CGPathAddArcToPoint(CGMutablePathRef cg_nullable path, const CGAffineTransform * __nullable m, CGFloat x1, CGFloat y1, CGFloat x2, CGFloat y2, CGFloat radius) CG_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_2_0); /* /向路径中追加一段路径 */ CG_EXTERN void CGPathAddPath(CGMutablePathRef cg_nullable path1, const CGAffineTransform * __nullable m, CGPathRef cg_nullable path2) CG_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_2_0); /*** Path information functions. ***/ /* 判断路径是否为空*/ CG_EXTERN bool CGPathIsEmpty(CGPathRef cg_nullable path) CG_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_2_0); /* 判断路径是否为某个矩形 */ CG_EXTERN bool CGPathIsRect(CGPathRef cg_nullable path, CGRect * __nullable rect) CG_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_2_0); /*获取路径当前绘制所在的点*/ CG_EXTERN CGPoint CGPathGetCurrentPoint(CGPathRef cg_nullable path) CG_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_2_0); /* 获取路径包含所有点的尺寸 */ CG_EXTERN CGRect CGPathGetBoundingBox(CGPathRef cg_nullable path) CG_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_2_0); /*获取某个路径的尺寸 */ CG_EXTERN CGRect CGPathGetPathBoundingBox(CGPathRef cg_nullable path) CG_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_4_0); /* 判断路径是否包含某个点 */ CG_EXTERN bool CGPathContainsPoint(CGPathRef cg_nullable path, const CGAffineTransform * __nullable m, CGPoint point, bool eoFill) CG_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_2_0); /* The types of path elements returned by `CGPathApply'. */ //当每次向CGPath路径做操作时,操作的过程实际上都会被记录下来,每个操作行为节点都被封装为了CGPathElement结构体 typedef CF_ENUM(int32_t, CGPathElementType) { kCGPathElementMoveToPoint, //移动到点的操作 kCGPathElementAddLineToPoint, //添加到线的操作 kCGPathElementAddQuadCurveToPoint, //添加到二次贝塞尔曲线的操作 kCGPathElementAddCurveToPoint, //添加到三次贝塞尔曲线的操作 kCGPathElementCloseSubpath //闭合路径的操作 }; struct CGPathElement { CGPathElementType type;//操作点的类型 CGPoint * points;//对应的点集 }; typedef struct CGPathElement CGPathElement; /* 函数指针 */ typedef void (*CGPathApplierFunction)(void * __nullable info, const CGPathElement * element); /* 获取所有操作行为 */ CG_EXTERN void CGPathApply(CGPathRef cg_nullable path, void * __nullable info, CGPathApplierFunction cg_nullable function) CG_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_2_0); typedef void (^CGPathApplyBlock)(const CGPathElement * element); CG_EXTERN void CGPathApplyWithBlock(CGPathRef path, CGPathApplyBlock CF_NOESCAPE block) CG_AVAILABLE_STARTING(__MAC_10_13, __IPHONE_11_0); CF_ASSUME_NONNULL_END CF_IMPLICIT_BRIDGING_DISABLED #endif /* CGPATH_H_ */