Swift中UILabel初始无动画旋转后缩放动画异常问题咨询
解决UILabel初始旋转自动动画恢复至0度的问题
我完全懂你遇到的头疼问题——想让UILabel一开始就带着缩放+旋转的静态状态,只给缩放加动画,结果初始旋转莫名其妙自己动画回0度了。咱们来一步步解决它:
问题根源解析
你当前代码的问题主要有两个:
- Transform被覆盖:你先后给
recordedTime?.transform赋值了两次,第二次的旋转变换直接覆盖了第一次的缩放变换,导致初始状态其实只有旋转、没有缩放。 - 动画未保留旋转状态:如果动画块里只设置缩放变换,系统会默认把旋转也重置为0,看起来就像初始旋转被动画“拉回去”了。
另外,建议先把视图添加到父视图再设置初始变换,避免系统布局流程干扰初始状态。
解决方案代码示例
1. 合并初始的缩放+旋转变换
CGAffineTransform支持叠加,我们把两种变换合并成一个,确保初始状态同时包含缩放和旋转:
// 先创建缩放变换,再叠加90度旋转(π/2弧度) let initialScale = CGAffineTransform(scaleX: 0.1, y: 0.1) let initialRotation = CGAffineTransform(rotationAngle: .pi / 2) let combinedInitialTransform = initialScale.concatenating(initialRotation)
2. 添加视图后设置初始状态
先把Label加到父视图,再设置合并后的初始变换,避免布局干扰:
view.addSubview(recordedTime!) // 无动画设置初始状态 recordedTime?.transform = combinedInitialTransform
3. 动画时保留旋转状态
动画块里要基于初始的旋转状态修改缩放,而不是重新创建一个只包含缩放的变换:
UIView.animate(withDuration: 0.50, delay: 0.0, options: [], animations: { // 保持旋转,设置你想要的最终缩放值(这里以1.0为例) let finalTransform = CGAffineTransform(scaleX: 1.0, y: 1.0) .concatenating(initialRotation) recordedTime?.transform = finalTransform }, completion: nil)
或者更简洁的方式,直接基于当前变换调整缩放(适合从0.1到1.0这种倍数缩放):
UIView.animate(withDuration: 0.50) { guard let currentTransform = recordedTime?.transform else { return } // 从0.1缩放到1.0,就是乘以10倍 let scaledTransform = currentTransform.scaledBy(x: 10.0, y: 10.0) recordedTime?.transform = scaledTransform }
额外注意点
如果你的Label用了Auto Layout,一定要先设置好位置、大小约束,避免布局更新时意外重置transform。
内容的提问来源于stack exchange,提问作者Chewie The Chorkie
相关产品推荐
相关产品推荐

