ios - UIBezierPath 点在路径的一部分

标签 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,我想信息在路径对象内部的某个地方。但是,无论是 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/

相关文章:

objective-c - iOS缓存库不起作用

ios - Swift - 具有类型和协议(protocol)的属性

ios - 从UIActivityViewController调用时,选择收件人后WhatsApp卡住

c++ - 正确地将 B 转换为 MB,或者完全错误

ios - 如何设置 UIBezierPath 边框以在 ios 中查看?

ios - 如何创建两个自定义 Segue,每个方向一个?

ios - NSMutableArray 在以其他方法访问时崩溃

objective-c - OSX 上自动更新应用程序的常见更新程序?

swift - 带有鹳动画的圆形 UIBezierPath

ios - 使用 UIBezierPath 绘制极坐标函数