在Swift中将CAShapeLayer路径从旧值设置为新值

时间:2018-03-20 15:16:39

标签: swift core-animation cashapelayer

我是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,有byValuefromValue

已绘制更新的路径,但遗憾的是,动画未显示toValue更新。

任何帮助,提示或建议都会非常感激地收到。

干杯!

编辑以根据@ matt的反馈添加更多详细信息:TLDR;更新路径,我想我应该用toValue制作动画。

我存储了一个包含strokeEnd之后的CAShapeLayer的数组。该路径基于可以具有三个不同值的数据来确定,并且应该来自(x:i,y:0) - &gt; (x:i,y:n)。其中x是固定位置,y是路径的终点,在给定的array [i]列中。

如果第i个位置的数据有更新,我会重新计算UIBezierPathUIBezierPath

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} }}

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! :)