UIBezierPath指向路径的分数

时间:2014-08-02 17:11:08

标签: ios objective-c uibezierpath quartz-core

给定一个任意UIBezierPath,我正在寻找一种方法来获得该路径长度的一小部分。

示例:

UIBezierPath *path = [UIBezierPath bezierPath];
[path moveToPoint:CGPointMake(200.0, 200.0)];
[path addLineToPoint:CGPointMake(200.0, 400.0)];

CGPoint p = [path pointAtFraction:0.5];
在这种情况下,

p应为{x: 200.0, y: 300.0}

我知道这个简单的例子可以计算出来,但我正在寻找适合任何UIBezierPath的解决方案(弧形,圆形等等)

看到基本生活在CAShapeLayer之内的UIBezierPath及其属性strokeEnd,我认为信息位于路径对象中。但是,UIBezierPathCGPathRef接口都没有显示任何实现此目的的方法。

我尝试创建CAShapeLayer,设置strokeEnd并从图层中检索CGPathRef,但路径保持不变。

有没有办法(公共API)来实现这个目标?

2 个答案:

答案 0 :(得分:8)

前段时间我发了一个基于贝塞尔曲线的旋转木马菜单。我认为这段代码可以帮到你:

CGFloat bezierInterpolation(CGFloat t, CGFloat a, CGFloat b, CGFloat c, CGFloat d) {
    CGFloat t2 = t * t;
    CGFloat t3 = t2 * t;
    return a + (-a * 3 + t * (3 * a - a * t)) * t
           + (3 * b + t * (-6 * b + b * 3 * t)) * t
           + (c * 3 - c * 3 * t) * t2
           + d * t3;
}

- (CGPoint)getPointForT:(CGFloat)t {
    return CGPointMake(bezierInterpolation(t, _p1.x, _p2.x, _p3.x, _p4.x), bezierInterpolation(t, _p1.y, _p2.y, _p3.y, _p4.y));
}

t - 您的分数长度< 0,1>

_p1,_p2,_p3,_p4 - 曲线点(查看此网站以便稍微看一眼:http://cubic-bezier.com/#.17,.67,.83,.67

答案 1 :(得分:4)

抱歉这是一个巨大的延迟。我实际上解决了这个问题超过1年前,哇。 我在UIBezierPath创建了一个小类别来完成这项工作。 GitHub Repo here

从1年前重新阅读我的代码后,我不得不说我以前用来编码的方式非常令人震惊:D缺乏文档令人不安。如果您需要更多信息,请告诉我,我会更新回购。