使用CATransform3DScale实现视图弹出效果时UIView消失如何解决
问题原因及修复方案
核心问题点
- 缩放参数逻辑错误:你当前
CATransform3DScale的x、y缩放因子设置为0,动画会把视图从原始大小逐步缩到完全不可见,这就是动画过程中视图消失的原因。动画结束后,Core Animation默认会将动画从layer上移除,layer恢复到原本的正常状态,所以视图会重新显示。 - 动画属性配置缺失:如果你的需求是动画结束后保持最终状态,需要配置动画的
fillMode和isRemovedOnCompletion属性,避免动画结束后回弹。 - 额外优化:将
zPosition设置为Float.greatestFiniteMagnitude没有必要,只要保证该值大于同层级其他视图的zPosition即可,过大的数值反而可能引发层级渲染异常。
实现【缩小消失】动画的修改后代码:
private func setupAnimation(){ var transform = CATransform3DIdentity transform.m34 = -1.0/500.0 // 按需调整zPosition,只要大于同层级其他视图即可 containerViews[0].layer.zPosition = 100 // 缩到0保持逻辑不变 transform = CATransform3DScale(transform, 0, 0, 1) let animation = BasicAnimation(keyPath: .transform) animation.fromValue = CATransform3DIdentity animation.toValue = transform animation.duration = 3.0 // 配置动画结束后保持状态,不自动移除 animation.fillMode = .forwards animation.isRemovedOnCompletion = false animation.setAnimationDidStop { _ in print("hello") // 如果需要隐藏视图可以在这里设置isHidden,或者重置transform // self.containerViews[0].isHidden = true self.containerViews[0].layer.zPosition = 0 } animation.animate(in: containerViews[0].layer) }
实现【弹出放大】效果的调整方案:
把transform = CATransform3DScale(transform, 0, 0, 1)替换为如下代码即可,可按需调整放大倍数:
transform = CATransform3DScale(transform, 1.5, 1.5, 1)
内容的提问来源于stack exchange,提问作者Ahmed
相关产品推荐
相关产品推荐

