链接 UIView 动画



我想通过以下步骤为我的UIImageView制作动画:

  1. 缩放 2 倍
  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又回到了以前的大小,然后移动。如何移动缩放view

我也尝试在animate块内更改图层的anchorPoint,但没有成功

也许有更简单的方法可以实现我的目标:能够缩小图像,然后聚焦在 3 个自定义点上,然后放大到初始大小。

一种方法是将动画的开头放在前一个动画的完成处理程序中:

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 及更高版本。有关早期版本,请参阅此答案的先前修订版。

对于您的第一个问题:由于您将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那就更好

最新更新