首页 > 解决方案 > 用 CGAffineTransform 链接 UIView 动画缩放和翻译

问题描述

我正在尝试使用animate(withDuration:animations:). 目标是向下移动视图,然后向右移动,同时放大。

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

这是我将应用于我的视图的 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)
            })
        }

过渡 1 `


现在,当我试图在向右移动时放大视图时,似乎它正在将比例应用于已经转换的视图,这导致在第二个动画开始之前将所有内容向下移动(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))
            })
        }

在此处输入图像描述

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

标签: swiftuiviewcgaffinetransform

解决方案


我的解决方案更像是一个热修复,但它是你想要的:

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

推荐阅读