我是Core Animation的新用户,我尝试根据新数据更新strokeEnd
的{{1}},从旧值更新为新的更新值。
所以基本上我有一个绘制的CAShapeLayer
,并更新它的CAShapeLayer
,并使用UIBezierPath
通过这样做来动画新CABasicAnimation(forKey: "strokeEnd")
:< / p>
strokeEnd
其中layerAnimation = CABasicAnimation(keyPath: "strokeEnd")
layerAnimation.toValue = 1
shapeLayer.strokeEnd = 1
layerAnimation.duration = 0.4
shapeLayer.add(layerAnimation, forKey: animation.identifier)
是animation.identifier
值,用于确定应使用哪个动画。
到目前为止,我一直在深入挖掘Apple的核心动画文档,并在堆栈溢出中寻找可能的线索,但到目前为止没有任何运气。
据我所知,通过在动画中只分配一个值,核心动画会找出路径本身,但到目前为止没有运气。我还尝试计算新旧Y值之间的差异,并使用String Enum
,有byValue
或fromValue
。
已绘制更新的路径,但遗憾的是,动画未显示toValue
更新。
任何帮助,提示或建议都会非常感激地收到。
干杯!
编辑以根据@ matt的反馈添加更多详细信息:TLDR;更新路径,我想我应该用toValue制作动画。
我存储了一个包含strokeEnd
之后的CAShapeLayer
的数组。该路径基于可以具有三个不同值的数据来确定,并且应该来自(x:i,y:0) - &gt; (x:i,y:n)。其中x是固定位置,y是路径的终点,在给定的array [i]列中。
如果第i个位置的数据有更新,我会重新计算UIBezierPath
,UIBezierPath
newPath(x:y:h:) -> UIBezierPath
if let previous: CAShapeLayer = previousColumns[i] {
shapeLayer = previous
bezierPath = UIBezierPath()
bezierPath = newPath(x: xPoint(i), y: newY, viewHeight: height)
shapeLayer.path = bezierPath.cgPath
animate(shapeLayer: shapeLayer, animation: .updateAnimation)
} else { draw new CAShapeLayer with UIBezierPath }
包含首先提到的代码,因为我的理解是,在动画发生之前,应该将animate(shapeLayer:animation:)
或CABasicAnimation
添加到给定的{{1} }}
答案 0 :(得分:3)
好的,经过一些指导,@ matt让我意识到,不是应该更新的strokeEnd,而是路径。所以通过稍微调整我的代码,我意识到通过设置要绘制的新列的UIBezierPath
,首先设置旧的列,然后创建新路径,我可以使用{{设置路径的动画。 1}}用于路径,使用来自value的动画作为旧路径,并使用toValue作为新值。
CABasicAnimation
然后更新动画块:
if let previous: CAShapeLayer = previousColumns[i], let oldPath: CGPath = previous.path {
shapeLayer = previous
bezierPath = UIBezierPath(cgPath: oldPath)
shapeLayer.path = bezierPath.cgPath
let newBezierPath = newPath(x: x, y: newY, viewHeight: height)
animate(shapeLayer: shapeLayer, animation: .updateAnimation, newBezierPath: newBezierPath.cgPath)
}
再一次,我没有想到这一点,没有@ matt的有用提示,所以谢谢你@matt! :)