如何使用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
相关产品推荐
相关产品推荐

