Skip to content

19.2_创建自定义的Present或Dismiss动画

想要让你的App拥有独一无二的转场动画吗?🎉 别担心,自定义Present/Dismiss动画就是你的秘密武器!它能让你完全掌控视图控制器出现和消失的方式,打造令人惊艳的用户体验。准备好开始了吗?让我们一起深入探索吧!

协议与对象

首先,你需要了解几个关键的协议和对象。UIViewControllerTransitioningDelegate 协议负责提供转场动画所需的动画控制器和交互控制器。你需要实现这个协议,告诉系统如何执行Present和Dismiss动画。

UIViewControllerAnimatedTransitioning 协议定义了动画控制器的行为。你需要创建一个类,遵循这个协议,并实现 transitionDuration(using:)animateTransition(using:) 方法。前者定义动画的持续时间,后者则负责执行实际的动画。

实现动画控制器

现在,让我们创建一个自定义的动画控制器。这个类需要遵循 UIViewControllerAnimatedTransitioning 协议。在 animateTransition(using:) 方法中,你可以使用 UIView.animate(withDuration:animations:) 方法来创建各种动画效果,例如淡入淡出、缩放、平移等等。

swift
class CustomPresentAnimator: NSObject, UIViewControllerAnimatedTransitioning {
    func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
        return 0.5 // 动画持续时间
    }

    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
        // 获取目标视图控制器和容器视图
        let toViewController = transitionContext.viewController(forKey: .to)!
        let containerView = transitionContext.containerView

        // 设置初始状态
        toViewController.view.alpha = 0

        // 添加目标视图到容器视图
        containerView.addSubview(toViewController.view)

        // 执行动画
        UIView.animate(withDuration: transitionDuration(using: transitionContext), animations: {
            toViewController.view.alpha = 1
        }) { (finished) in
            // 动画完成,通知系统
            transitionContext.completeTransition(finished)
        }
    }
}

实现Transitioning Delegate

接下来,你需要创建一个类,遵循 UIViewControllerTransitioningDelegate 协议。在这个类中,你需要实现 animationController(forPresented:presenting:source:)animationController(forDismissed:) 方法,分别返回Present和Dismiss动画的动画控制器。

swift
class CustomTransitioningDelegate: NSObject, UIViewControllerTransitioningDelegate {
    func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        return CustomPresentAnimator() // 返回Present动画控制器
    }

    func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        return CustomDismissAnimator() // 返回Dismiss动画控制器
    }
}

应用自定义转场

最后,你需要将自定义的Transitioning Delegate应用到你的视图控制器上。在Present视图控制器之前,设置其 transitioningDelegate 属性为你的自定义Delegate,并设置 modalPresentationStyle.custom

swift
let viewController = YourViewController()
viewController.transitioningDelegate = customTransitioningDelegate
viewController.modalPresentationStyle = .custom
present(viewController, animated: true, completion: nil)

现在,当你Present或Dismiss这个视图控制器时,就会使用你自定义的动画效果啦!是不是很酷?😎

更多可能性

自定义Present/Dismiss动画的可能性是无限的!你可以尝试各种不同的动画效果,例如:

  • 缩放动画: 让视图控制器从小变大,或者从大变小。
  • 滑动动画: 让视图控制器从屏幕边缘滑入或滑出。
  • 翻转动画: 让视图控制器像翻书一样翻转。

记住,大胆尝试,发挥你的创意!💪 相信你一定能创造出令人惊艳的转场动画!

本站使用 VitePress 制作