iOS之CGPath相关属性(一)

#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_ */

 

posted @ 2017-10-19 08:30  ForeverGuard  阅读(751)  评论(0编辑  收藏  举报