如何为视图直接层启用动画?为何视图层背景色变更无动画?
关于UIView直接层动画的两个问题解答
1. 如何为视图的直接层(direct layer)启用动画?
要给UIView的直接layer加上动画效果,有两种简单好用的方法:
- 用UIKit动画块包裹修改操作:UIKit的
UIView.animate(withDuration:)不仅能处理UIView本身的属性动画,也能让其layer的属性变更带上过渡动画。比如:
UIView.animate(withDuration: 0.3) { view.layer.backgroundColor = UIColor.blue.cgColor }
- 用Core Animation事务做精细控制:如果需要调整动画的速度、曲线等细节,可以用
CATransaction手动开启动画上下文:
CATransaction.begin() CATransaction.setAnimationDuration(0.3) // 还可以设置动画曲线,比如CATransaction.setAnimationTimingFunction(CAMediaTimingFunction(name: .easeInOut)) view.layer.backgroundColor = UIColor.blue.cgColor CATransaction.commit()
2. 为什么修改视图层背景色会立即变更,子层却有动画效果?
核心原因是UIView会默认禁用其直接layer的隐式动画,而独立的CALayer(也就是你代码里的mySublayer)默认保留了隐式动画功能:
- 当你修改UIView的
layer属性时,UIView所在的运行循环上下文会自动关闭Core Animation的隐式动画。这是因为UIView有自己封装的动画系统(就是我们常用的UIView动画块),苹果为了避免两套动画机制冲突,就默认关闭了直接layer的隐式动画。 - 而你添加的子层
mySublayer是独立的CALayer,它不受UIView的动画管理规则约束,所以修改它的属性(比如背景色)时,会触发Core Animation默认的隐式过渡动画。
比如你给子层改背景色,不用写额外动画代码也会有平滑效果:
// 这段代码会让mySublayer的背景色自动过渡 view.mySublayer.backgroundColor = UIColor.green.cgColor
但修改直接layer的话,就必须用前面说的动画块或者CATransaction才能看到动画效果。
内容的提问来源于stack exchange,提问作者mrnifnif
相关产品推荐
相关产品推荐

