如何用UIView.animate替代CATransition动画?
用UIView API替代CATransition实现push动画并结合其他动画
替代原CATransition的UIView.transition代码
原CATransition实现的是从顶部push的文本切换动画,用UIView.transition可以完全复刻,代码如下:
UIView.transition(with: textLabel, duration: 0.25, options: [.transitionPush, .transitionFromTop, .curveEaseInOut], animations: { // 必须在这个闭包里修改textLabel的内容(比如文本),过渡动画才会生效 self.textLabel.text = "你的新文本内容" }, completion: nil)
参数对应关系:
duration: 0.25:和原动画时长一致.transitionPush:对应原animation.type = .push.transitionFromTop:对应原animation.subtype = .fromTop.curveEaseInOut:对应原timingFunction = .easeInEaseOut
和其他动画结合的方法
如果你需要同时执行这个push过渡动画和其他属性动画(比如透明度、位置变化),可以通过以下两种方式实现:
方式1:同步执行两个动画块
直接同时调用UIView.animate(处理属性动画)和UIView.transition(处理过渡动画),系统会自动同步它们的动画进度:
// 执行其他属性动画(比如透明度变化) UIView.animate(withDuration: 0.25, options: .curveEaseInOut) { self.textLabel.alpha = 0.7 // 还可以添加其他属性修改,比如frame、transform等 } // 同步执行push过渡动画 UIView.transition(with: textLabel, duration: 0.25, options: [.transitionPush, .transitionFromTop, .curveEaseInOut], animations: { self.textLabel.text = "新文本" }, completion: nil)
方式2:用CATransaction统一控制动画
如果需要更精确的同步(比如统一设置延迟、动画曲线),可以用CATransaction包裹两个动画:
CATransaction.begin() CATransaction.setAnimationDuration(0.25) CATransaction.setAnimationTimingFunction(CAMediaTimingFunction(name: .easeInEaseOut)) // 属性动画 UIView.animate(withDuration: 0.25) { self.textLabel.transform = CGAffineTransform(scaleX: 1.05, y: 1.05) } // 过渡动画 UIView.transition(with: textLabel, options: [.transitionPush, .transitionFromTop]) { self.textLabel.text = "新文本" } CATransaction.commit()
注意事项
你之前用UIView.transition没效果,大概率是没在animations闭包里修改textLabel的内容——过渡动画需要伴随视图内容的变化才会触发,这和CATransition需要在添加动画后修改内容的逻辑一致。
内容的提问来源于stack exchange,提问作者Tywin
相关产品推荐
相关产品推荐

