You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用CATransaction实现CALayer出现时的缩放动画效果

CALayer 弹出出现动画无效果问题解决方案

根因说明

新添加到视图树的CALayer需要先完成首次布局提交到渲染树,之后的属性变化才会触发隐式动画。你在同一个RunLoop周期内完成了视图添加、初始transform设置、目标transform设置三个操作,Core Animation渲染时会直接取最终的transform值作为初始渲染状态,不会生成过渡动画。
你之前加固定延迟生效的本质是把transform更新放到了图层首次提交之后的RunLoop周期,不需要硬编码延迟时间,用DispatchQueue.main.async即可实现同等效果,它会把任务提交到主队列下一个执行周期,刚好等当前视图的初始布局、图层提交完成。

正确实现代码

@IBAction func click() {
    myView = MyView(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
    view.addSubview(myView)
    // 禁用初始transform设置的隐式动画,避免多余动画
    CATransaction.begin()
    CATransaction.setDisableActions(true)
    myView.squareLayer.setAffineTransform(.init(scaleX: 0, y: 0))
    CATransaction.commit()
    
    // 提交到下一个RunLoop周期执行弹出动画
    DispatchQueue.main.async {
        CATransaction.begin()
        CATransaction.setAnimationDuration(1)
        // 直接使用恒等变换即可,不需要重新创建
        self.myView.squareLayer.setAffineTransform(.identity)
        CATransaction.commit()
    }
}

补充优化建议

你代码中手动调用的myView.drawLayers()不需要额外执行,MyView的layoutSubviews方法会在视图添加到父视图后自动触发,自动完成图层的path、frame配置。

内容的提问来源于stack exchange,提问作者Sweeper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 01:36:02