给定一个任意的 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
接口(interface)都没有显示任何实现此目的的方法。
我尝试创建一个 CAShapeLayer
,设置 strokeEnd
并从图层中检索 CGPathRef
,但路径保持不变。
有什么方法(公共(public) API)可以做到这一点吗?
最佳答案
前段时间我做了一个基于贝塞尔三次曲线的轮播菜单。我认为这段代码可以帮助你:
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)
关于ios - UIBezierPath 点在路径的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25097503/