【发布时间】:2018-12-13 16:54:03
【问题描述】:
我希望在视图动画比例之前旋转视图而不进行动画。如果我之后有动画,我现在拥有它的方式会忽略我的初始视图旋转。
label.transform = CGAffineTransform(rotationAngle: CGFloat(90.0 * .pi / 180))
animateLabel(label:label)
func animateLabel(label:UILabel) {
label.transform = CGAffineTransform(scaleX: 0.6, y: 0.6)
UIView.animate(withDuration: 0.2, animations: {
label.transform = CGAffineTransform(scaleX: 1.1, y: 1.1)
},
completion: { _ in
UIView.animate(withDuration: 0.1) {
label.transform = CGAffineTransform(scaleX: 1.0, y: 1.0)
}
})
}
更新:我如何使用 Matt 的答案更新我的代码,使其正确动画:
我首先将初始旋转设置为一个变换变量,然后在我调用 animateLabel 时发送它:
var transforms: CGAffineTransform = .identity
transforms = transforms.concatenating(CGAffineTransform(rotationAngle: CGFloat(90.0 * .pi / 180)))
animateLabel(label:label, transforms:transforms)
我连接比例并将变换设置为修改后的变换。然后我可以使用 scale by 来制作实际的动画:
func animateLabel(label:UILabel, transforms:CGAffineTransform) {
transforms.concatenating(CGAffineTransform(scaleX: 0.6, y: 0.6))
label.transform = transforms
UIView.animate(withDuration: 0.2, animations: {
label.transform = transforms.scaledBy(x: 1.1, y: 1.1)
},
completion: { _ in
UIView.animate(withDuration: 0.1) {
label.transform = transforms.scaledBy(x: 1.0, y: 1.0)
}
})
}
【问题讨论】:
-
是的,因为您在 animateLabel 函数的开头应用了新的转换。
-
我明白了,但是如何使这种轮换永久化?我什至尝试重新定义身份。
-
您需要创建结合旋转和缩放的新变换。您可以查看
CGAffineTransform.scaledBy来修改现有的变换,或者查看CGAffineTransform.concatenating来组合2 个变换。 -
实际上 scaleBy 不会为视图设置动画。没关系
标签: swift rotation uilabel transform