Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何设置CGpath数组的绘图动画?_Swift_Uibezierpath_Cashapelayer_Cabasicanimation_Cgpath - Fatal编程技术网

Swift 如何设置CGpath数组的绘图动画?

Swift 如何设置CGpath数组的绘图动画?,swift,uibezierpath,cashapelayer,cabasicanimation,cgpath,Swift,Uibezierpath,Cashapelayer,Cabasicanimation,Cgpath,我正在尝试制作一个为用户绘制对象的应用程序。我现在有一个这样的对象,它由[UIBezierPath]类型的数组组成。然后,我使用循环将数组中的所有UIBezierPaths更改为CGPaths,然后希望逐个绘制这些路径的动画。然而,当我现在尝试这段代码时,它不起作用,而且我在网上找不到任何关于这段代码的有用信息。此代码用于将由UIBezierPath组成的数组macbookPath转换为CGPath: for path in macbookPath { drawingPath.a

我正在尝试制作一个为用户绘制对象的应用程序。我现在有一个这样的对象,它由
[UIBezierPath]
类型的数组组成。然后,我使用循环将数组中的所有
UIBezierPath
s更改为
CGPath
s,然后希望逐个绘制这些路径的动画。然而,当我现在尝试这段代码时,它不起作用,而且我在网上找不到任何关于这段代码的有用信息。此代码用于将由
UIBezierPath
组成的数组
macbookPath
转换为
CGPath

for path in macbookPath {
        drawingPath.append(path.cgPath)
    }
然后我用这段代码尝试绘制路径:

for cgPath in drawingPath {
        shapeLayer.path = cgPath
    }
这是函数
drawForm()
的其余代码,该函数用于将表单绘制到名为
aiDrawView
的视图上:

@objc func drawForm() {
    var drawingPath = [CGPath]()
    var macbookPath = Forms.MacbookForm()
    let shapeLayer = CAShapeLayer()
    shapeLayer.frame = aiDrawView.bounds

    for path in macbookPath {
        drawingPath.append(path.cgPath)
    }

    for cgPath in drawingPath {
        shapeLayer.path = cgPath
    }

    let strokeEndAnimation = CABasicAnimation(keyPath: "strokeEnd")
    strokeEndAnimation.duration = 2.0
    strokeEndAnimation.fromValue = 0.0

    shapeLayer.add(strokeEndAnimation, forKey: "strokeEndAnimation")
}

我对
CAShapeLayer
CABasicAnimation
UIBezierPath
非常陌生,因此非常感谢您的帮助!!!:D

我建议从路径数组中构建一个
UIBezierPath
,然后设置动画:

var paths: [UIBezierPath] = ...

let path = UIBezierPath()

paths.forEach { path.append($0) }

shapeLayer.path = path.cgPath

let animation = CABasicAnimation(keyPath: "strokeEnd")
animation.duration = 2.0
animation.fromValue = 0.0
shapeLayer.add(animation, forKey: nil)
例如,这里有100条路径,组合成一条路径,其
strokeEnd
随后在形状层上设置动画:


假设你的路径数组真的形成了一个连续的路径,我可能会建议将它存储为
CGPoint
数组。然后,您可以从中构建单个路径。这消除了所有这些路径的开销。此外,它还为原始数据集的缩放打开了大门,无需引入任何工件,能够使用直线连接选项,如果您有不需要的线段序列,等等。

您想要什么效果?是否要从起点开始绘制路径1,使路径越来越长,直到绘制完整路径,然后以相同的从头到尾方式在顶部绘制新路径,直到阵列中的所有路径同时可见?是否要从头到尾跟踪一条路径,然后将其删除并绘制第二条路径?由于以下几个原因,当前代码没有意义。1:for循环将使用阵列中的每个路径替换形状层的路径,直到形状层的路径包含最后一条路径,并且除了最后一条路径之外,您不会使用任何其他路径进行任何绘制。2:您创建了一个将fromValue发送到0的CAAnimation,但从未将
toValue
设置为1。这应该行得通,但更安全的做法是将
toValue
显式设置为1.0ool。(投票)您是如何创建100个子路径的?使用
sin()
函数生成它们?那么你是如何从动画中创建GIF动画的呢?如果你正在组装的路径是不连续的,会发生什么呢?笔划动画是否会有间断,并在瞬间从一个子路径的末端跳到下一个子路径的开始?这正是我所期望的。是的,只是。是的,也是,但我相信它是瞬间跳跃的。关于GIF动画,这只是一个模拟器的QuickTime屏幕截图,在Photoshop中转换为GIF。谢谢老兄!这实际上帮了我很多忙!不过我还有一个问题,因为路径现在显示在屏幕的左上角,而我希望它显示在中间。使用.transform方法缩放路径很简单,但是移动路径要困难得多,而且不起作用……您的“不连续”路径看起来实际上是一条带虚线的普通路径。这并不是一条不连续的道路。