在Swift中将CAShapeLayer路径从旧值移动到新值
我是Core Animation的strokeEnd
,我试图根据新数据将strokeEnd
的CAShapeLayer
从旧值更新为新的更新值。
所以基本上我有一个绘制的CAShapeLayer
,并更新它的UIBezierPath
,并使用CABasicAnimation(forKey: "strokeEnd")
,通过这样做来为新的strokeEnd
设置动画strokeEnd
:
layerAnimation = CABasicAnimation(keyPath: "strokeEnd")
layerAnimation.toValue = 1
shapeLayer.strokeEnd = 1
layerAnimation.duration = 0.4
shapeLayer.add(layerAnimation, forKey: animation.identifier)
其中animation.identifier
是一个String Enum
值,用于确定应使用哪个动画。
到目前为止,我一直在深入研究Apple的Core Animation文档,并在这里讨论堆栈溢出问题,以获取可能的线索,但至今没有任何运气。
据我了解,只通过在动画中分配一个值,核心动画会自行找出路径,但目前为止没有运气。 我也试着来计算新老顶Y值之间的差额,并使用byValue
,有和没有fromValue
或toValue
。
已更新的路径已绘制,但不幸的是,动画未随strokeEnd
更新显示。
任何帮助,提示或建议,都会非常感激地收到。
干杯!
编辑根据@ matt的反馈添加更多细节:TLDR; 更新路径,认为我应该与toValue动画。
我存储包含绘制的阵列CAShapeLayer
一个遵循UIBezierPath
。 该路径是根据可以具有三个不同值的数据确定的,并且应该从(x:i,y:0) - >(x:i,y:n)开始。 其中x是一个固定的位置,y是路径的终点,在给定的数组[i]列中。
如果第i个位置的数据有更新,我将重新计算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
或CAKeyFrameAnimation
添加到给定的CAShapeLayer
。
好了,经过一些指导,@matt让我意识到,这不是中风,而是应该更新,而是路径。 所以通过调整我的代码,我意识到,通过设置新列的UIBezierPath
被绘制,然后创建新路径,然后创建新路径,我可以使用CABasicAnimation
为路径设置路径的动画,通过使用value中的动画作为旧路径,并将toValue作为新值。
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)
}
然后更新动画块:
layerAnimation = CABasicAnimation(keyPath: "path")
layerAnimation.fromValue = shapeLayer.path
layerAnimation.toValue = newBezierPath
shapeLayer.path = newBezierPath
再一次,我不知道这一点,没有@亚特的有用的提示,所以谢谢@matt! :)
链接地址: http://www.djcxy.com/p/39495.html上一篇: Animate CAShapeLayer path from old value to new value in Swift
下一篇: How's the iOS core animation works for setting a image with animation