我想通过以下步骤为UIImageView
制作动画:
所以我想这样:
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
?
我也尝试在anchorPoint
块内更改图层的animate
,但没有成功
也许还有更简单的方法可以实现我的目标:缩小图像,然后聚焦在3个自定义点上,然后放大到初始大小。
答案 0 :(得分:1)
第一个问题:由于您将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
答案 1 :(得分:1)
一种方法是将动画的开始放在先前动画的完成处理程序中:
UIView.animate(withDuration: 1, animations: {
// animation 1
}, completion: { _ in
UIView.animate(withDuration: 2, animations: {
// animation 2
}, completion: { _ in
UIView.animate(withDuration: 1, animations: {
// animation 3
}, completion: { _ in
// etc
})
})
})
如果要避免嵌套的动画塔(每个动画都在上一个的完成处理程序中),则可以使用关键帧动画,例如这是一个五秒钟的动画,其中包含三个独立的关键帧,每个关键帧的持续时间占总数的三分之一,并且其开始时间已相应设置:
UIView.animateKeyframes(withDuration: 5, delay: 0, animations: {
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
}
})