如何修复iOS15中CATransition push动画缺失淡入淡出效果的问题
iOS 15+ CATransition push动画丢失淡入淡出效果修复方案
原因说明
从iOS 15开始,系统修改了CATransition类型为.push/.moveIn的默认动画插值逻辑,移除了默认附带的透明度渐变效果,仅保留位移变换,因此会出现旧版本正常、新版本只有位移没有淡入淡出的问题。
最小修改方案
你可以通过私有键值配置强制恢复透明度插值效果,无需改动原有动画逻辑:
let pushAnimation: CATransition = { let animation = CATransition() animation.timingFunction = CAMediaTimingFunction(name: .easeIn) animation.type = .push animation.subtype = .fromTop animation.duration = 0.5 // 新增配置:强制开启透明度过渡效果 animation.setValue(true, forKey: "kCATransition_overrideOpacity") return animation }() ... label.layer.add(pushAnimation, forKey: nil) label.text = newText
无审核风险兼容方案
如果担心私有键值存在App Store审核风险,可以改用动画组手动组合位移和透明度效果,全系统版本兼容:
// 生成自定义Push+淡入淡出动画 func makePushFadeAnim(duration: CFTimeInterval, subtype: CATransitionSubtype) -> CAAnimation { // 位移动画 let pushAnim = CATransition() pushAnim.type = .push pushAnim.subtype = subtype pushAnim.duration = duration pushAnim.timingFunction = CAMediaTimingFunction(name: .easeIn) // 透明度渐变动画 let fadeAnim = CABasicAnimation(keyPath: "opacity") fadeAnim.fromValue = 0 fadeAnim.toValue = 1 fadeAnim.duration = duration fadeAnim.timingFunction = CAMediaTimingFunction(name: .easeIn) // 组合动画 let group = CAAnimationGroup() group.animations = [pushAnim, fadeAnim] group.duration = duration group.isRemovedOnCompletion = true return group } // 使用示例 let anim = makePushFadeAnim(duration: 0.5, subtype: .fromTop) label.layer.add(anim, forKey: nil) label.text = newText
内容的提问来源于stack exchange,提问作者bshkrva
相关产品推荐
相关产品推荐

