CALayer调用setAnimationDuration后淡入动画失效问题求助
嘿,我来帮你捋捋这个CALayer淡入动画没生效的问题!这种情况我在项目里碰到过好多次,大多是几个容易忽略的细节踩坑了,咱们一个个排查:
初始透明度没设置为0
这是最常见的坑!如果你的CALayer一开始opacity就是默认的1.0,那动画从0到1的变化根本看不出来——因为图层本来就是完全显示的。一定要在添加动画前把初始透明度设为0:// Objective-C示例 CALayer *myLayer = [CALayer layer]; myLayer.opacity = 0.0; // 关键一步! myLayer.frame = CGRectMake(50, 50, 100, 100); myLayer.backgroundColor = [UIColor redColor].CGColor; [self.view.layer addSublayer:myLayer];// Swift示例 let myLayer = CALayer() myLayer.opacity = 0.0 myLayer.frame = CGRect(x: 50, y: 50, width: 100, height: 100) myLayer.backgroundColor = UIColor.red.cgColor view.layer.addSublayer(myLayer)动画添加时机错误
如果你在把图层添加到父图层之前就给它加动画,动画可能不会被正确触发。正确的顺序应该是:先把图层添加到父视图的层级里,再创建并添加动画。比如:// 先将图层加入父层级 view.layer.addSublayer(myLayer) // 再创建并添加淡入动画 let fadeAnimation = CABasicAnimation(keyPath: "opacity") fadeAnimation.fromValue = 0.0 fadeAnimation.toValue = 1.0 fadeAnimation.duration = 1.5 // 动画时长 fadeAnimation.fillMode = .forwards fadeAnimation.isRemovedOnCompletion = false myLayer.add(fadeAnimation, forKey: "fadeIn")这里还要注意
fillMode和isRemovedOnCompletion的设置:如果不设这两个,动画结束后图层会变回初始的0透明度,可能会让你误以为动画没执行(不过你说图层直接显示,这步可能不是你的问题,但还是要注意)。动画的keyPath写错了
别搞混UIView和CALayer的属性!UIView用的是alpha,但CALayer对应的是opacity。如果你的动画keyPath写成"alpha",那动画根本不会作用在图层上,自然看不到效果。后续代码直接修改了opacity属性
如果在添加动画之后,你又直接设置了myLayer.opacity = 1.0,这会直接覆盖动画的效果——因为CALayer的模型层属性会优先于动画的表现层。要确保动画执行期间,不要直接修改opacity值。图层没被正确加入可视层级
虽然你说图层直接显示了,但还是要确认下:父图层的hidden是不是设为YES?或者父视图的alpha是0?不过这种情况图层应该看不到,所以大概率不是这个问题,但可以快速排查下。
先从最前面的两点开始检查,尤其是初始透明度的设置,绝大多数时候都是这个问题导致的!
内容的提问来源于stack exchange,提问作者Gizmodo

