我可以使用CALayer
更改属性来为CABasicAnimation
对象制作动画,如下代码所示:
let animationOfPropertyOpacity = CABasicAnimation(keyPath: "opacity")
animationOfPropertyOpacity.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut)
animationOfPropertyOpacity.fromValue = 0
animationOfPropertyOpacity.toValue = 1
myLayer.addAnimation(animationOfPropertyOpacity, forKey: "fade")
在这种情况下,动画将创建0到1之间的线性插值。我可以对其他属性(如缩放,位置或旋转)执行相同操作。
如果我想从A点(0,3)移动到B点(3,0),但是将圆圈对准C点(0,0)?
我希望继续使用fromValue
到toValue
,但动画制作我称之为旋转的自定义属性。旋转将基于作为中心的点C计算每个插值,并从该中心创建半径。
我需要在哪里放置计算每一步的函数?
我尝试了继承CALayer
并添加一个名为rotation的自定义属性。然后将代码添加到needsDisplayForKey
以重绘图层:
@NSManaged var rotation: CGFloat
override class func needsDisplayForKey(key: String) -> Bool {
if (key == "rotation") {
return true
}
return super.needsDisplayForKey(key)
}
这会调用drawInContext
并使整个CALayer
变黑。我在drawInContext
打印并且在更改其他属性(如不透明度)时不会调用它,似乎没有必要重新绘制图层。
应该有一个方法在CALayer
中调用动画的每一帧,我可以在应用更改之前实现一个函数。
我也无法找到正确的位置来实现我已经创建的自定义属性的功能,即使没有动画也能实际反映更改。让我们说一个属性customOpacity
只是反转不透明度的影响并相应地更新图层。我只能通过函数updateRotation(rotation: CGFloat)
来实现。