Swift 使用CGAffineTransform缩放链接UIView动画&;翻译

Swift 使用CGAffineTransform缩放链接UIView动画&;翻译,swift,uiview,cgaffinetransform,Swift,Uiview,Cgaffinetransform,我正在尝试使用在操场上设置UIView动画。目标是向下移动视图,然后将其向右移动,同时将其放大 所以我分两步来做,第一步完成后调用第二个动画 下面是我将应用于我的视图的3个转换 let scaleUp = CGAffineTransform(scaleX: 2, y: 2) let moveDown = CGAffineTransform(translationX: 0, y: 100) let moveRight = CGAffineTransform(translationX: 100, y

我正在尝试使用在操场上设置UIView动画。目标是向下移动视图,然后将其向右移动,同时将其放大

所以我分两步来做,第一步完成后调用第二个动画

下面是我将应用于我的视图的3个转换

let scaleUp = CGAffineTransform(scaleX: 2, y: 2)
let moveDown = CGAffineTransform(translationX: 0, y: 100)
let moveRight = CGAffineTransform(translationX: 100, y: 0)
要执行
moveDown
然后执行
moveRight
操作,我将第二个连接到第一个

UIView.animate(withDuration: 2, animations: {
            circleView.transform = moveDown
        }) { _ in
            //First animation completed
            UIView.animate(withDuration: 4, animations: {
                circleView.transform = moveDown.concatenating(moveRight)
            })
        }
`


现在,当我尝试在向右移动时向上缩放视图时,它似乎正在对已变换的视图应用缩放,这导致在第二个动画开始之前将所有内容向下移动(2次)

UIView.animate(withDuration: 2, animations: {
            circleView.transform = moveDown
        }) { _ in
            //First animation completed
            UIView.animate(withDuration: 2, animations: {
                circleView.transform = moveDown.concatenating(scaleUp.concatenating(moveRight))
            })
        }


如何在不重置初始转换的情况下实现向右移动+放大?

在应用转换的顺序中,我认为是因为您在转换之前应用了缩放,它采用的是放大值

moveRight.concatenating(scaleUp)

可能行。

我想你的问题已经解决了。据说,为了实现您的目标(两个同步动画),您需要使用caanimation和layer addAnimation

我试过这个,效果很好

let scaleAA = CABasicAnimation(keyPath: "transform.scale")
scaleAA.fromValue = 1
scaleAA.byValue = 2
scaleAA.duration = 1
scaleAA.timingFunction = CAMediaTimingFunction.init(name: .easeOut)

let scaleXX = CABasicAnimation(keyPath: "position.x")
scaleXX.fromValue = 0
scaleXX.byValue = 20
scaleXX.duration = 1
scaleXX.timingFunction = CAMediaTimingFunction.init(name: .easeOut)

UIView.animate(withDuration: 1, animations: {
    v1.transform = moveDown
}) { _ in
    //First animation completed
    v1.layer.add(scaleAA, forKey: "scale")
    v1.layer.add(scaleXX, forKey: "xxxx")
}

我的解决方案更像是热修复程序,但它正是您想要的:

1
执行下移变换的动画

2
还原上述变换(无动画)

3
circleView
设置为下移变换后的位置(无动画)

4
执行向右移动和放大的动画

UIView.animate(withDuration: 2, animations: {
        circleView.transform = moveDown //1
    }) { _ in
        //First animation completed
        circleView.transform = .identity //2
        circleView.frame.origin.y += 100 //3
        UIView.animate(withDuration: 2, animations: {
            circleView.transform = moveRight.concatenating(scaleUp) //4
        })
    }

我也试过了,它向右移动2倍,同时在平移前向下推谢谢,这很有效。不想麻烦链接多个Cabasicanization