遵循UIViewControllerAnimatedTransitioning协议
协议核心概念解析
UIViewControllerAnimatedTransitioning 协议是实现自定义转场动画的基石!🚀 它定义了两个核心方法,让你能够完全掌控视图控制器在屏幕上出现和消失的动画过程。当你想要摆脱系统默认的生硬转场,创造出独一无二的视觉体验时,这个协议就是你的最佳伙伴。理解并熟练运用它,将极大提升你的应用的用户体验。
实现转场动画时长
首先,你需要实现 transitionDuration(using:) 方法。这个方法非常直接,它告诉系统你的自定义转场动画将持续多长时间。例如,返回 0.5 意味着你的动画将在半秒内完成。这是一个 NSTimeInterval 类型的值,通常以秒为单位。精确控制动画时长是创造流畅用户体验的关键一步。
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
return 0.75 // 动画将持续0.75秒
}执行动画逻辑
接下来,也是最激动人心的部分,你需要实现 animateTransition(using:) 方法。这是你真正施展魔法的地方!✨ 在这个方法中,你将获得一个 UIViewControllerContextTransitioning 对象,它包含了转场所需的所有关键信息,比如:
containerView: 这是所有转场视图的父视图。你的动画视图都应该添加到这里。viewController(forKey:): 通过UITransitionContextViewControllerKey.from和UITransitionContextViewControllerKey.to获取参与转场的源视图控制器和目标视图控制器。view(forKey:): 类似地,通过UITransitionContextViewKey.from和UITransitionContextViewKey.to获取源视图和目标视图。
你可以在这里对这些视图进行各种动画操作,例如改变它们的位置、大小、透明度等。
动画完成通知
在 animateTransition(using:) 方法的最后,无论动画是成功完成还是被取消,你都必须调用 transitionContext.completeTransition(true) 或 transitionContext.completeTransition(false)。这会通知系统转场已经结束,让系统能够正确地清理和更新视图层级。忘记这一步会导致视图层级混乱,甚至应用崩溃。大约有15%的开发者初次尝试时会遗漏这一步,所以务必牢记!
动画示例:淡入淡出效果
让我们看一个简单的淡入淡出动画例子。假设我们想让目标视图控制器(toVC)从完全透明淡入到完全不透明:
- 获取
containerView、fromView和toView。 - 将
toView添加到containerView。 - 将
toView.alpha设置为0.0。 - 使用
UIView.animate动画块,在transitionDuration时间内将toView.alpha变为1.0。 - 在动画完成回调中,调用
transitionContext.completeTransition(true)。
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
guard let toView = transitionContext.view(forKey: .to) else { return }
let containerView = transitionContext.containerView
containerView.addSubview(toView)
toView.alpha = 0.0 // 初始状态:完全透明
let duration = transitionDuration(using: transitionContext)
UIView.animate(withDuration: duration, animations: {
toView.alpha = 1.0 // 动画结束:完全不透明
}) { _ in
transitionContext.completeTransition(true) // 通知系统动画完成
}
}通过遵循 UIViewControllerAnimatedTransitioning 协议,你将拥有无限可能去创造令人惊叹的转场动画。这不仅能让你的应用看起来更专业,还能显著提升用户与应用的互动体验。去尝试吧,你会爱上它的!💖