swift - 链接 UIView 动画
swift - chaining UIView animation
我想通过以下步骤为我的 UIImageView
制作动画:
- 缩放2倍
- 缩放图像移动
所以我正在尝试这样:
UIView.animate(withDuration: 0.5, animations: {
self.imageView.transform = CGAffineTransform(scaleX: 2, y: 2)
}) { _ in
UIView.animate(withDuration: 1.0, animations: {
self.imageView.transform = CGAffineTransform(translationX: -50, y: -50)
}) { _ in
//other steps
}
}
但是结果是在移动之前imageView
回到原来的尺寸然后移动。如何移动 scaled view
?
我也曾尝试更改 animate
块内的图层 anchorPoint
但没有成功
也许还有更简单的方法可以实现我的目标:能够缩小图像,然后聚焦在 3 个自定义点,然后放大到初始尺寸。
对于您的第一个问题:由于您将 transform
分配给一个新的而不保留旧的配置,因此在您的第二个动画中,您的视图将转换为默认比例 (1, 1)。您所需要的只是将 transform
分配给一个包含所有旧配置以及您想要的新配置的新配置。
UIView.animate(withDuration: 0.5, animations: {
self.button.transform = self.button.transform.scaledBy(x: 2, y: 2)
}) { _ in
UIView.animate(withDuration: 1.0, animations: {
self.button.transform = self.button.transform.translatedBy(x: -50, y: -50)
}) { _ in
}
}
如果用animateKeyframes
就更好了
一种方法是将动画的开始放在前一个动画的完成处理程序中:
UIView.animate(withDuration: 1) {
// animation 1
} completion: { _ in
UIView.animate(withDuration: 2) {
// animation 2
} completion: { _ in
UIView.animate(withDuration: 1) {
// animation 3
} completion: { _ in
// etc
}
}
}
如果你想避免嵌套动画塔(每个都在前一个的完成处理程序中),你可以使用关键帧动画,例如这是一个五秒的动画,具有三个独立的关键帧,每个关键帧的持续时间均为总持续时间的三分之一,其开始时间也相应设置:
UIView.animateKeyframes(withDuration: 5, delay: 0) {
UIView.addKeyframe(withRelativeStartTime: 0, relativeDuration: 1 / 3) {
// animation 1
}
UIView.addKeyframe(withRelativeStartTime: 1 / 3, relativeDuration: 1 / 3) {
// animation 2
}
UIView.addKeyframe(withRelativeStartTime: 2 / 3, relativeDuration: 1 / 3) {
// animation 3
}
}
以上内容适用于 Swift 5.3 及更高版本。对于早期版本,请参阅此答案的 previous revision。
我想通过以下步骤为我的 UIImageView
制作动画:
- 缩放2倍
- 缩放图像移动
所以我正在尝试这样:
UIView.animate(withDuration: 0.5, animations: {
self.imageView.transform = CGAffineTransform(scaleX: 2, y: 2)
}) { _ in
UIView.animate(withDuration: 1.0, animations: {
self.imageView.transform = CGAffineTransform(translationX: -50, y: -50)
}) { _ in
//other steps
}
}
但是结果是在移动之前imageView
回到原来的尺寸然后移动。如何移动 scaled view
?
我也曾尝试更改 animate
块内的图层 anchorPoint
但没有成功
也许还有更简单的方法可以实现我的目标:能够缩小图像,然后聚焦在 3 个自定义点,然后放大到初始尺寸。
对于您的第一个问题:由于您将 transform
分配给一个新的而不保留旧的配置,因此在您的第二个动画中,您的视图将转换为默认比例 (1, 1)。您所需要的只是将 transform
分配给一个包含所有旧配置以及您想要的新配置的新配置。
UIView.animate(withDuration: 0.5, animations: {
self.button.transform = self.button.transform.scaledBy(x: 2, y: 2)
}) { _ in
UIView.animate(withDuration: 1.0, animations: {
self.button.transform = self.button.transform.translatedBy(x: -50, y: -50)
}) { _ in
}
}
如果用animateKeyframes
一种方法是将动画的开始放在前一个动画的完成处理程序中:
UIView.animate(withDuration: 1) {
// animation 1
} completion: { _ in
UIView.animate(withDuration: 2) {
// animation 2
} completion: { _ in
UIView.animate(withDuration: 1) {
// animation 3
} completion: { _ in
// etc
}
}
}
如果你想避免嵌套动画塔(每个都在前一个的完成处理程序中),你可以使用关键帧动画,例如这是一个五秒的动画,具有三个独立的关键帧,每个关键帧的持续时间均为总持续时间的三分之一,其开始时间也相应设置:
UIView.animateKeyframes(withDuration: 5, delay: 0) {
UIView.addKeyframe(withRelativeStartTime: 0, relativeDuration: 1 / 3) {
// animation 1
}
UIView.addKeyframe(withRelativeStartTime: 1 / 3, relativeDuration: 1 / 3) {
// animation 2
}
UIView.addKeyframe(withRelativeStartTime: 2 / 3, relativeDuration: 1 / 3) {
// animation 3
}
}
以上内容适用于 Swift 5.3 及更高版本。对于早期版本,请参阅此答案的 previous revision。