在Swift中将CAShapeLayer路径从旧值移动到新值

我是Core Animation的strokeEnd ,我试图根据新数据将strokeEndCAShapeLayer从旧值更新为新的更新值。

所以基本上我有一个绘制的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 ,有和没有fromValuetoValue

已更新的路径已绘制,但不幸的是,动画未随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:)包含了第一次提到的代码,因为我的理解是,在动画发生之前,可以将CABasicAnimationCAKeyFrameAnimation添加到给定的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