Skip to content

实现自定义模态(Modal)转场

实现自定义模态(Modal)转场,让你的应用更具个性!🎉 你可以通过自定义转场动画,为用户提供更流畅、更吸引人的体验。让我们一起探索如何实现吧!

模态转场基础

模态视图控制器(Modal View Controller)通常用于呈现独立的功能或信息,例如设置、编辑或确认操作。默认的模态转场可能显得有些单调,但你可以通过自定义转场动画来改变这一点。

  • UIModalPresentationStyle: 定义模态视图控制器的呈现方式,例如全屏、当前上下文等。
  • UIViewControllerTransitioningDelegate: 负责提供转场动画的控制器。

创建自定义转场动画

要实现自定义模态转场,你需要创建一个遵守 UIViewControllerAnimatedTransitioning 协议的类。这个类将负责定义转场动画的具体过程。

  1. 遵守 UIViewControllerAnimatedTransitioning 协议: 这个协议有两个主要方法:
    • transitionDuration(using:): 返回转场动画的时长。
    • animateTransition(using:): 实现转场动画的具体逻辑。
  2. 实现 animateTransition(using:) 方法: 在这个方法中,你需要获取转场的上下文,并使用 UIView.animate(withDuration:animations:) 或其他动画方法来实现你的自定义动画。
swift
class CustomModalAnimationController: NSObject, UIViewControllerAnimatedTransitioning {
    func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
        return 0.5 // 动画时长0.5秒
    }

    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
        // 实现动画逻辑
    }
}

设置 UIViewControllerTransitioningDelegate

接下来,你需要创建一个类来管理转场动画的代理。这个类需要遵守 UIViewControllerTransitioningDelegate 协议,并提供动画控制器。

  1. 遵守 UIViewControllerTransitioningDelegate 协议: 这个协议有几个方法可以实现,用于提供不同的动画控制器。
    • animationController(forPresented:presenting:source:): 返回呈现模态视图控制器的动画控制器。
    • animationController(forDismissed:): 返回解除模态视图控制器的动画控制器。
  2. 实现代理方法: 在这些方法中,你需要返回你创建的自定义动画控制器。
swift
class CustomModalTransitioningDelegate: NSObject, UIViewControllerTransitioningDelegate {
    let animationController = CustomModalAnimationController()

    func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        return animationController
    }

    func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        return animationController
    }
}

应用自定义转场

最后,你需要将自定义转场应用到你的模态视图控制器上。

  1. 创建 UIViewControllerTransitioningDelegate 的实例: 在你的视图控制器中创建一个 CustomModalTransitioningDelegate 的实例。
  2. 设置 modalPresentationStyletransitioningDelegate: 在呈现模态视图控制器之前,设置其 modalPresentationStyle.custom,并将其 transitioningDelegate 设置为你的代理实例。
swift
let modalVC = ModalViewController()
modalVC.modalPresentationStyle = .custom
let transitioningDelegate = CustomModalTransitioningDelegate()
modalVC.transitioningDelegate = transitioningDelegate
present(modalVC, animated: true, completion: nil)

动画实例

一个简单的动画实例可以是让模态视图控制器从屏幕底部滑入,并在解除时滑出。你可以在 animateTransition(using:) 方法中实现这个动画。

swift
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
    let containerView = transitionContext.containerView
    let toViewController = transitionContext.viewController(forKey: .to)!
    let fromViewController = transitionContext.viewController(forKey: .from)!

    let finalFrame = transitionContext.finalFrame(for: toViewController)
    let initialFrame = CGRect(x: 0, y: containerView.bounds.height, width: finalFrame.width, height: finalFrame.height)

    toViewController.view.frame = initialFrame
    containerView.addSubview(toViewController.view)

    UIView.animate(withDuration: transitionDuration(using: transitionContext), animations: {
        toViewController.view.frame = finalFrame
    }, completion: { _ in
        transitionContext.completeTransition(true)
    })
}

通过以上步骤,你就可以实现自定义的模态转场动画了!🎉 记住,创意是无限的,你可以尝试各种不同的动画效果,让你的应用更加出色。 🚀

本站使用 VitePress 制作