美文网首页iOS程序员的业余沙龙
iOS 贝塞尔曲线上所有点的获取

iOS 贝塞尔曲线上所有点的获取

作者: 时光追寻 | 来源:发表于2017-03-31 11:20 被阅读215次

    最近在项目中用到了贝塞尔曲线画图,关于贝塞尔曲线的用法网上相应的文章很多,在此不再赘述,但是获取贝塞尔曲线上所有的点却提到的很少,话不多少,直接上干货。

    首先新建一个UIBezierPath分类,也可以新建一个类继承UIBezierPath,后期直接使用这个类实例化对象来调用获取点的方法得到贝塞尔曲线上的所有点,在此我选择以分类的方式

    2FADECBD-9216-4A6B-8848-87CFB420141D.png

    创建完分类之后

    在.h文件中声明方法
    - (NSArray *)points;
    
    .h文件实现
    
    #import <UIKit/UIKit.h>
    
    @interface UIBezierPath (GetAllPoints)
    
    /** 获取所有点*/
    - (NSArray *)points;
    
    @end
    
    
    .m文件实现
    
    #import "UIBezierPath+GetAllPoints.h"
    
    #define VALUE(_INDEX_) [NSValue valueWithCGPoint:points[_INDEX_]]
    
    @implementation UIBezierPath (GetAllPoints)
    
    void getPointsFromBezier(void *info,const CGPathElement *element){
        NSMutableArray *bezierPoints = (__bridge NSMutableArray *)info;
        CGPathElementType type = element->type;
        CGPoint *points = element->points;
        
        if (type != kCGPathElementCloseSubpath) {
            [bezierPoints addObject:VALUE(0)];
            if ((type != kCGPathElementAddLineToPoint) && (type != kCGPathElementMoveToPoint)) {
                [bezierPoints addObject:VALUE(1)];
            }
        }
        
        if (type == kCGPathElementAddCurveToPoint) {
            [bezierPoints addObject:VALUE(2)];
        }
        
    }
    
    - (NSArray *)points
    {
        NSMutableArray *points = [NSMutableArray array];
        CGPathApply(self.CGPath, (__bridge void *)points, getPointsFromBezier);
        return points;
        
    }
    
    @end
    
    上述方法中,主要通过调用
    CG_EXTERN void CGPathApply(CGPathRef cg_nullable path, void * __nullable info,
        CGPathApplierFunction cg_nullable function)
    方法来获取贝塞尔曲线上的所有点,方法中包含三个参数,分别为贝塞尔曲线的path、贝塞尔曲线的info、还有就是自定义方法的函数指针,通过函数指针将points中所有的点都处理完成。
    

    参考资料:http://blog.csdn.net/chasingdreamscoder/article/details/52988057

    相关文章

      网友评论

        本文标题:iOS 贝塞尔曲线上所有点的获取

        本文链接:https://www.haomeiwen.com/subject/hdimottx.html