【问题标题】:Animating multiple UIBezier paths in a single CAShapeLayer在单个 CAShapeLayer 中为多个 UIBezier 路径设置动画
【发布时间】:2018-07-11 18:06:23
【问题描述】:

我想在屏幕上绘制多个字母的动画。我有我的数据在一个数组中。该数组包含线对象,这些线对象具有动画的开始和结束时间,以及构成线的点。我目前的代码如下:

private func animateSentData(data: WhiteboardData) {
        // I currently only draw a single letter
        let path: UIBezierPath = UIBezierPath()
        if let line = data.lines.first {
            for (n, point) in line.pts.enumerated() {
                let translation: (CGFloat, CGFloat) = (point.x / data.w, point.y / data.h)
                if n == 0 {
                    path.move(to: CGPoint(x: view.frame.width * translation.0, y: view.frame.height * translation.1))
                } else {
                    path.addLine(to: CGPoint(x: view.frame.width * translation.0, y: view.frame.height * translation.1))
                }
            }
        }
        let shapelayer: CAShapeLayer = CAShapeLayer()
        shapelayer.path = path.cgPath
        shapelayer.strokeColor = UIColor.black.cgColor
        shapelayer.fillColor = UIColor.clear.cgColor
        shapelayer.lineCap = kCALineCapRound
        shapelayer.lineWidth = brushWidth

        shapelayer.frame = view.bounds
        view.layer.addSublayer(shapelayer)
        let animation: CABasicAnimation = CABasicAnimation(keyPath: "strokeEnd")
        animation.fromValue = 0
        animation.duration = 3.0 // A test duration
        shapelayer.add(animation, forKey: "myAnimation")
    }

在上面的代码中你可以看到我只画了第一个字母。我将如何绘制其他字母?我需要为每个字母创建一个新的CAShapeLayer 吗?这样做似乎效率低下。 CAShapeLayer 是否有可能拥有多个 UIBezierPaths 然后单独为它们设置动画?对此的任何提示将不胜感激!谢谢

【问题讨论】:

    标签: ios swift uibezierpath cashapelayer


    【解决方案1】:

    您绝对可以通过使用append(_:) 实例方法组合多个UIBezierPath 来使用单个CAShapeLayer

    代码看起来像这样:

    private func animateSentData(data: WhiteboardData) {
    
        var path = UIBezierPath()
        for line in data.lines {
            let subPath = UIBezierPath()
    
            for (n, point) in line.pts.enumerated() {
                /// Construct your subPath
                …
            }
            path.append(subPath)
        }
    
        let shapeLayer = CAShapeLayer()
        shapeLayer.path = path.cgPath
        …
    }
    

    澄清:

    虽然您可以将多个路径组合成一个 UIBezierPath,但之后您无法为单个子路径设置动画。

    【讨论】:

    • 这些子路径可以单独动画吗?例如我想为subpath1 设置动画 2 秒,等待 4 秒,然后为subpath2 设置动画。
    • 不,我认为这不可能。如果你想这样做,你应该使用多个CAShapeLayer
    猜你喜欢
    • 1970-01-01
    • 2019-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多