Skip to content

遵循UIViewControllerAnimatedTransitioning协议

协议核心概念解析

UIViewControllerAnimatedTransitioning 协议是实现自定义转场动画的基石!🚀 它定义了两个核心方法,让你能够完全掌控视图控制器在屏幕上出现和消失的动画过程。当你想要摆脱系统默认的生硬转场,创造出独一无二的视觉体验时,这个协议就是你的最佳伙伴。理解并熟练运用它,将极大提升你的应用的用户体验。

实现转场动画时长

首先,你需要实现 transitionDuration(using:) 方法。这个方法非常直接,它告诉系统你的自定义转场动画将持续多长时间。例如,返回 0.5 意味着你的动画将在半秒内完成。这是一个 NSTimeInterval 类型的值,通常以秒为单位。精确控制动画时长是创造流畅用户体验的关键一步。

swift
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
    return 0.75 // 动画将持续0.75秒
}

执行动画逻辑

接下来,也是最激动人心的部分,你需要实现 animateTransition(using:) 方法。这是你真正施展魔法的地方!✨ 在这个方法中,你将获得一个 UIViewControllerContextTransitioning 对象,它包含了转场所需的所有关键信息,比如:

  • containerView: 这是所有转场视图的父视图。你的动画视图都应该添加到这里。
  • viewController(forKey:): 通过 UITransitionContextViewControllerKey.fromUITransitionContextViewControllerKey.to 获取参与转场的源视图控制器和目标视图控制器。
  • view(forKey:): 类似地,通过 UITransitionContextViewKey.fromUITransitionContextViewKey.to 获取源视图和目标视图。

你可以在这里对这些视图进行各种动画操作,例如改变它们的位置、大小、透明度等。

动画完成通知

animateTransition(using:) 方法的最后,无论动画是成功完成还是被取消,你都必须调用 transitionContext.completeTransition(true)transitionContext.completeTransition(false)。这会通知系统转场已经结束,让系统能够正确地清理和更新视图层级。忘记这一步会导致视图层级混乱,甚至应用崩溃。大约有15%的开发者初次尝试时会遗漏这一步,所以务必牢记!

动画示例:淡入淡出效果

让我们看一个简单的淡入淡出动画例子。假设我们想让目标视图控制器(toVC)从完全透明淡入到完全不透明:

  1. 获取 containerViewfromViewtoView
  2. toView 添加到 containerView
  3. toView.alpha 设置为 0.0
  4. 使用 UIView.animate 动画块,在 transitionDuration 时间内将 toView.alpha 变为 1.0
  5. 在动画完成回调中,调用 transitionContext.completeTransition(true)
swift
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 协议,你将拥有无限可能去创造令人惊叹的转场动画。这不仅能让你的应用看起来更专业,还能显著提升用户与应用的互动体验。去尝试吧,你会爱上它的!💖

本站使用 VitePress 制作