Skip to content
Snippets Groups Projects
SideMenuPresenter.swift 2.07 KiB
Newer Older
Bruno Muniz's avatar
Bruno Muniz committed
import UIKit

public final class SideMenuPresenter: NSObject,
                                      Presenting,
                                      UIViewControllerTransitioningDelegate {

    public init(dismissInteractor: SideMenuDismissInteracting = SideMenuDismissInteractor(),
                menuAnimator: SideMenuAnimating = SideMenuAnimator(),
                viewAnimator: UIViewAnimating.Type = UIView.self) {
        self.dismissInteractor = dismissInteractor
        self.menuAnimator = menuAnimator
        self.viewAnimator = viewAnimator
        super.init()
    }

    let dismissInteractor: SideMenuDismissInteracting
    let menuAnimator: SideMenuAnimating
    let viewAnimator: UIViewAnimating.Type
    
    // MARK: Presenting

    public func present(_ viewControllers: UIViewController..., from parent: UIViewController) {
        guard let screen = viewControllers.first else {
            fatalError("Tried to present empty list of view controllers")
        }

        screen.modalPresentationStyle = .overFullScreen
        screen.transitioningDelegate = self
        parent.present(screen, animated: true)
Bruno Muniz's avatar
Bruno Muniz committed
    }

    // MARK: UIViewControllerTransitioningDelegate

    public func animationController(
        forPresented presented: UIViewController,
        presenting: UIViewController,
        source: UIViewController
    ) -> UIViewControllerAnimatedTransitioning? {
        SideMenuPresentTransition(dismissInteractor: dismissInteractor,
                                  menuAnimator: menuAnimator,
                                  viewAnimator: viewAnimator)
    }

    public func animationController(
        forDismissed dismissed: UIViewController
    ) -> UIViewControllerAnimatedTransitioning? {
        SideMenuDismissTransition(menuAnimator: menuAnimator,
                                  viewAnimator: viewAnimator)
    }

    public func interactionControllerForDismissal(
        using animator: UIViewControllerAnimatedTransitioning
    ) -> UIViewControllerInteractiveTransitioning? {
        dismissInteractor.interactionInProgress ? dismissInteractor : nil
    }
}