在iOS中将直线变为圆

在iOS中将直线变为圆,ios,objective-c,core-animation,uiviewanimation,uibezierpath,Ios,Objective C,Core Animation,Uiviewanimation,Uibezierpath,我的想法是将一条直线转换成一个圆,但单元格的偏移量会在表格视图中拖动 当我拖动单元格时,我希望线条围绕图像弯曲成一个圆圈。 我在下面添加了一张图片,以帮助演示具有不同阻力偏移的不同状态 我不知道从哪里开始,我正在考虑也许使用UIBezierPath来绘制,但不确定这是否是最好的解决方案 如果你想让它成为动画,那么你就得为自己裁剪作品 曲线的核心动画是基于CGPATH对象的,它是UiBiZiErrPuth.U/P>背后的核心核心基础类。 使曲线从一个形状变为另一个形状的秘诀是使用相同数量和类型的控

我的想法是将一条直线转换成一个圆,但单元格的偏移量会在表格视图中拖动

当我拖动单元格时,我希望线条围绕图像弯曲成一个圆圈。 我在下面添加了一张图片,以帮助演示具有不同阻力偏移的不同状态

我不知道从哪里开始,我正在考虑也许使用UIBezierPath来绘制,但不确定这是否是最好的解决方案


如果你想让它成为动画,那么你就得为自己裁剪作品

曲线的核心动画是基于CGPATH对象的,它是UiBiZiErrPuth.U/P>背后的核心核心基础类。 使曲线从一个形状变为另一个形状的秘诀是使用相同数量和类型的控制点。您将无法使用任何标准的圆弧或椭圆形快捷方式(这些快捷方式生成更复杂的贝塞尔曲线,看起来像圆弧)

相反,您必须从一系列三次贝塞尔曲线的链接中分段构建圆的近似值。您应该能够非常接近4条链接的三次贝塞尔曲线,这些曲线的端点位于圆的N/s/E/W罗盘点,中间控制点在圆外均匀分布。几年前,我在网上查阅了一篇关于用贝塞尔点近似圆的文章。我建议你在这上面搜索一下

或者,我猜您可以使用CGPath或UIBezier快捷方式之一生成一条圆贝塞尔曲线,然后将生成的路径分解为构成它的基本体。Erica Sadun的杰出iOS开发者食谱系列包括一个食谱,展示了如何将UIBezier路径分解为原语

一旦有了一组圆的控制点,就需要将它们重新映射到构成直线的控制点。(贝塞尔曲线始终通过其起点和终点,如果将三次贝塞尔曲线的内部两个控制点放在一条线上,它将使曲线变成一条线。)

现在有两个形状,由相同数量的贝塞尔曲线和相同数量的控制点组成:一个圆和一条线。通过将每个控制点移动到不同的x/y坐标,可以将直线转换为圆或将圆转换为直线

然后,可以在控制点的起始坐标和结束坐标之间应用线性插值。使用用户对表格视图的拖动来生成从0到1的值,并将其应用于插值控制点值(在0.0时,控制点将位于其“直线”上)位置和曲线将绘制为一条直线。在1.0时,它们将位于圆位置,曲线将绘制为圆。在点之间,它们将是起点和终点位置之间的一小部分,您将得到一个介于线和圆之间的形状

一旦您了解了如何生成控制点以创建从直线平滑移动到圆的曲线,您就可以使用核心动画和CAShapeLayer来解决这一问题

如果这是有道理的话,那么你可能会想出如何做到这一点。如果你不知道我说的是什么,那么你可能是在你的头上

(我是Cocoa/iOS高级开发人员。我做过很多核心动画,一旦我有了圆贝塞尔控制点,我可能需要3到4个小时才能完成工作。)

仔细想想,使用UIView关键帧动画可能会简单得多。这样可以指定所有位于所需曲线上的控制点阵列,并从这些点生成平滑曲线。最好的是,它是UIView动画,使用起来比动画简单得多

请看我在github上的演示项目。这将使您在使用UIView关键帧动画方面领先一步。您需要的方法称为
animateKeyframesWithDuration:delay:options:animations:completion:


基于点的关键帧动画的缺点是,有时得到的曲线有“扭结”或者是你不期望或不想要的循环。你必须避免急弯。不过,在绘制草图时,我认为线到圆的过渡可能适用于关键帧视图动画。

我还没有尝试过,但在谷歌搜索之后,我发现了这一点,这可能会有所帮助。可能你可以创建一个正方形,然后更改角半径,增加当单元格被拖出时对其进行调整。感谢@RMK Jacob的及时评论!不幸的是,圆角只会改变视图的角,这可以将矩形视图转换为圆形。但是,如果这有任何意义,它无法将直线转换为圆形。如果使用玉米,它将是从角缩小的同一条直线埃拉迪乌斯。再次感谢!:)谢谢邓肯!我也在想同样的事情,关于UIBezier路径的线性插值,我只是想知道是否有一个更简单的解决方案,可以让它更简单,我不知道。我现在已经开始工作了,稍后将为那些希望做类似事情的人添加我的代码:)@NSDavidObject-您可以从直线绘制曲线。如果您可以共享一些代码,这将很有帮助snippet@npk是的,我能。稍后我将尝试查找该项目,看看是否可以共享它:)