我有将直线转换为圆的想法,但是在表格视图中单元格的偏移拖动了。

拖动单元格时,我希望线在图像周围弯曲成一个圆。
我在下面提供了一张图片,以帮助演示具有不同拖动偏移量的不同状态。

我不确定从哪里开始,我在考虑也许使用UIBezierPath进行绘制,但不确定这是否是最佳解决方案。

最佳答案

如果您希望它具有动画效果,那么您就可以为您完成工作了。

曲线的核心动画基于CGPath对象,该对象是UIBezierPath之后的基础Core Foundation类。

使曲线从一种形状变为另一种形状的秘密是使用相同数量和类型的控制点。您将无法使用任何标准的圆弧或椭圆快捷方式(它们会生成更复杂的看起来像圆弧的贝塞尔曲线。)

取而代之的是,您必须从一系列相连的三次贝塞尔曲线中逐段建立一个近似的圆。您应该能够使用4条链接的三次贝塞尔曲线相当接近,它们的端点线位于圆的N / S / E / W圆规点,并且中间控制点在圆外均匀分布。几年前,我在网上查找了一篇使用Bezier点近似近似圆的文章。我建议对此进行一些搜索。

或者,我猜您可以使用CGPath或UIBezier快捷方式之一生成圆形贝塞尔曲线,然后将生成的路径解构成组成它的图元。埃里卡·萨顿(Erica Sadun)出色的iOS开发者食谱系列包括一个食谱,该食谱显示了如何将UIBezier路径解构成其原语。

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

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

这样,您便可以在控制点的开始和结束坐标之间应用线性插值。使用用户在表格视图中的拖动来生成从0到1的值,并将其应用于插值的控制点值(在0.0时,控制点将位于其“直线”位置,并且曲线将绘制为直线在1.0处,它们将位于其圆的位置,并且您的曲线将绘制为一个圆。在它们之间的点处,它们将是其起始位置和结束位置之间的距离的一小部分,并且您将获得一个形状在直线和圆之间。

一旦弄清楚了如何生成控制点以创建从直线平滑过渡到圆弧的曲线,就可以使用Core Animation和CAShapeLayer解决此问题。

如果这有意义,那么您可能可以找出解决方法。如果您不知道我在说什么,那么您可能会不知所措。

(我是Cocoa / iOS的高级开发人员。我做了很多Core Animation,一旦我有了圆形的贝塞尔曲线控制点,可能要花3到4个小时才能得到您要工作的东西。 )

想一想,使用UIView关键帧动画可能会简单得多。这样就可以指定所有位于所需曲线上的控制点的数组,并从这些点生成平滑曲线。.最好的是,它是UIView动画,比CAAnimation易于使用。

看看我在github上的演示项目RandomBlobs。这应该使您开始使用UIView关键帧动画。您想要的方法称为animateKeyframesWithDuration:delay:options:animations:completion:

基于点的关键帧动画的缺点是,有时您获得的曲线会出现您不希望看到的“扭结”或循环。您必须避免急剧弯曲。不过,在勾勒出草图时,我认为线到圆过渡可能适用于关键帧视图动画。

10-08 12:49