swift - 用 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)
})
}
现在,当我试图在向右移动时放大视图时,似乎它正在将比例应用于已经转换的视图,这导致在第二个动画开始之前将所有内容向下移动(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))
})
}
如何在不重置初始转换的情况下实现向右移动 + 放大?
解决方案
我的解决方案更像是一个热修复,但它是你想要的:
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
})
}
推荐阅读
- c - 如何打印输入的项目名称?
- android - Android ROOM "java.lang.IllegalArgumentException: 列 '`activity_id`' 不存在"
- javascript - 使用顶级 React Children API 映射孩子
- laravel - Laravel 8 - 一次调用多个工厂状态
- java - JavaFX CSS 中的 -fx-text-fill 和 -fx-text-inner-color 有什么区别?
- azure - 术语“Get-AzADServicePrincipal”未被识别为 cmdlet、函数的名称
- javascript - 使用 Perfume.js 跟踪异步性能
- react-redux - 在“DefaultRootState”类型上不存在。TS2339
- node.js - 在 Vue 中使用 Nipplejs 和 Quasar
- sql - 查询生成器原始子查询不起作用