iOS 动画 -CATransaction CATransition UIView.transition
// CATransaction 的典型使用CATransaction.begin()CATransaction.setAnimationDuration(0.5)CATransaction.setAnimationTimingFunction(CAMediaTimingFunction(name: .easeOut))CATransaction.setCompletionBlock {print("动画完成")}layer.position = CGPoint(x: 300, y: 400) // 这会变成动画layer.opacity = 0.5 // 这也是动画CATransaction.commit() // 批量提交,同时执行
-
你对 CALayer 属性的修改(position、opacity、transform 等)
-
这些修改不会立即生效,而是被收集到当前事务中
-
当当前 RunLoop 周期结束时(或手动
commit()),事务被提交 -
Core Animation 计算所有变化之间的插值,生成动画
CATransition负责视图层级切换的过渡效果
CATransaction和CATransition的前缀都是来自core animation,QuartzCore框架。

// 你写的代码UIView.transition(with: myView,duration: 0.5,options: [.transitionFlipFromLeft]) {// 视图状态改变myView.backgroundColor = .redmyView.subview.isHidden = true}// 底层等效实现(简化版)CATransaction.begin()CATransaction.setAnimationDuration(0.5)// 创建转场动画并添加到 layerlet transition = CATransition()transition.type = .pushtransition.subtype = .fromLeftmyView.layer.add(transition, forKey: "transition")// 执行视图修改(会被 CATransaction 捕获)// 注意:UIView 的 backgroundColor 修改会转换为 CALayer 的动画CATransaction.setCompletionBlock {// UIView.transition 的 completion}CATransaction.commit()

Core Animation 的更新并不是“你每改一行代码就立刻发给 GPU/渲染进程”,而是批量收集:
因此内层 commit 的作用是:
-
结束内层的配置范围(比如内层设置 setDisableActions(true)只影响内层) -
但不触发整批变更的最终提交
CATransaction.begin()CATransaction.setDisableActions(true)layer.position = CGPoint(x: 50, y: 50) // 不动画(受内层影响)CATransaction.commit()
夜雨聆风