zoukankan      html  css  js  c++  java
  • 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_ */
  • 相关阅读:
    Ubuntu系统---安装思维导图XMind
    Git---Ubuntu下的安装与使用
    YOLO---YOLOv3 with OpenCV安装与使用
    Keras---Virtualenv 下安装Keras (基于Tensorflow后端)
    Python---virtualenv + Tensorflow + 安装jupyter notebook
    Ubuntu系统---以virtualenv方式安装Tensorflow-CPU
    Caffe---Pycaffe 绘制loss和accuracy曲线
    Caffe---自带工具 绘制loss和accuracy曲线
    day91 DjangoRestFramework学习三之认证组件、权限组件、频率组件、url注册器、响应器、分页组件
    day 90 DjangoRestFramework学习二之序列化组件
  • 原文地址:https://www.cnblogs.com/xianfeng-zhang/p/7690581.html
Copyright © 2011-2022 走看看