CAShapeLayer路径Spring动画未“过冲”

iswrvxsc  于 2023-05-05  发布在  Spring
关注(0)|答案(2)|浏览(118)

我正在尝试使用CASpringAnimation为CAShapeLayer路径设置动画。预期的结果是形状之间的“变形”,表现为“弹性”。
我有一个圆形和方形路径之间的基本代码示例,如下所示,但最终结果是一个Spring动画,它不会“过冲”超过最终的更大的方形路径,这是预期的行为。

我的代码是:

let springAnimation = CASpringAnimation(keyPath: "path")
springAnimation.damping = 1
springAnimation.duration = springAnimation.settlingDuration
springAnimation.fromValue = standardCirclePath().cgPath
springAnimation.toValue = standardSquarePath().cgPath

circleLayer.add(springAnimation, forKey: nil) // Where circleLayer (red background) is a sublayer of a basic UIView in the frame (blue background)

我有我的路径from this answer
CASpringAnimation是否有办法实现CAShapeLayer路径转换?否则,还有什么选择?

ahy6op9u

ahy6op9u1#

你好,我一直在处理你的问题,这是我的结果,在gif上的小故障是因为我的gif转换器是非常糟糕的转换器

这是密码

class ViewController: UIViewController {

    @IBOutlet weak var animatableVIew: UIView!
    var isBall = false
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }
    @IBAction func startAnimation(sender: AnyObject) {

        isBall = !isBall

        let springAnimation = CASpringAnimation(keyPath: "cornerRadius")
        let halfWidth = animatableVIew.frame.width / 2
        let cornerRadius: CGFloat = isBall ? halfWidth : 0
        springAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn)
        springAnimation.fromValue = isBall ? 0 : halfWidth ;
        springAnimation.toValue = cornerRadius;
        springAnimation.damping = 7
        springAnimation.duration = springAnimation.settlingDuration
        animatableVIew.layer.cornerRadius = cornerRadius

        let springAnimation2 = CAKeyframeAnimation(keyPath: "transform.scale")
        springAnimation2.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)
        springAnimation2.values = [1,0.9,1.4,0.8,1]
        springAnimation2.keyTimes = [ 0, (1 / 6.0), (3 / 6.0), (5 / 6.0), 1 ];
        springAnimation2.duration = springAnimation.settlingDuration * 0.5

        let groupSpringAnimation = CAAnimationGroup()
        groupSpringAnimation.animations = [springAnimation,springAnimation2]
        groupSpringAnimation.duration = springAnimation.settlingDuration
        groupSpringAnimation.beginTime = 0;
        animatableVIew.layer.addAnimation(groupSpringAnimation, forKey: "group")

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

我希望这对你有帮助

rvpgvaaj

rvpgvaaj2#

事实是:
CASpringAnimation只是不适用于路径。
就这样
即使是简单的路径,如扩大圆圈。
到2023年,这仍然是事实,不幸的是,这就是它的全部。
正如@CIFilter在评论中指出的那样,通常将路径扩展“更大”是一个不小的问题,他们根本没有解决。

相关问题