如何 'animate' 在 IOS 中改变视图的形状? (即改变它的路径从一个到另一个)

how to 'animate' changing shape of a view in IOS? (i.e. change it's path from one to another)

如何 'animate' 更改基于形状的自定义 UIView,从一种形状更改为另一种形状?

举个例子,一个人正在创建一个看起来像形状的 UIView,它是使用 UIBezierPath 创建的。但是您希望此视图对象以 'animated' 样式从自定义形状 1 更改为自定义形状 2?所以我可以使用 UIBezierPath 创建两个单独的路径来表示这两个形状,但我不清楚如何 'animate' 从一个移动到另一个?

也不确定 'animate' 在这里是否正确。例如,如果这本质上是不可动画的,那么我的意思可能是 'visually morphing' 从一个对象到另一个对象的视图。

我正在阅读这些内容,但仍然不太明白如何:UIBezierPath、CAShapeLayer、CADisplayLink,

您可以简单地更改 CAShapeLayerpath 属性,它将使用隐式动画进行动画处理。 display link 对于动画来说是不必要的,因为核心动画子系统会为你处理一切。显示器 link 适用于需要与显示器刷新率同步的高 performance/accuracy 计时器。

要更改 CAShapeLayer 的路径 属性,您可以使用 UIBezierPath 对象构建路径,然后 return 它的 CGPath。像(Swift)

let bezier = UIBezierPath()
bezier.moveToPoint(CGPointMake(100.0, 100.0))
bezier.addLineToPoint(CGPointMake(150.0, 90.0))
...
bezier.closePath()

let shapeLayer = CAShapeLayer()
shapeLayer.path = bezier.CGPath

请记住,这是真实的代码,但是,您需要构建形状图层的属性以进行显示,例如边界和位置,并且至少要设置形状图层的 strokeColor 这样你就可以看到发生了什么。出于同样的原因,fillColor 属性 也可以设置。

一旦您建立了初始形状(路径),您就可以创建第二条贝塞尔曲线路径,您的路径可以为其设置动画。不过,这就是问题所在。如果您的新路径没有与之前路径完全相同的点数,则动画可能不会达到您的预期。

很巧,我最近一直在玩这种东西,就是为了好玩。我写了一些代码来看看它是如何工作的。您可以在此处获取该 (Swift) 代码:https://github.com/perlmunger/Morph . It does what you see in this animation. It doesn't morph in exactly the way I would expect but it provides a neat illustration nonetheless: