给定一个任意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
,我认为信息位于路径对象中。但是,UIBezierPath
和CGPathRef
接口都没有显示任何实现此目的的方法。
我尝试创建CAShapeLayer
,设置strokeEnd
并从图层中检索CGPathRef
,但路径保持不变。
有没有办法(公共API)来实现这个目标?
答案 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缺乏文档令人不安。如果您需要更多信息,请告诉我,我会更新回购。