Skip to content

Instantly share code, notes, and snippets.

@alfian0
Last active July 3, 2020 06:54
Show Gist options
  • Save alfian0/b8e29325797307df38358bd33bf99c59 to your computer and use it in GitHub Desktop.
Save alfian0/b8e29325797307df38358bd33bf99c59 to your computer and use it in GitHub Desktop.
enum TransitionState {
case present
case dismiss
}
class MenuTransition: NSObject, UIViewControllerAnimatedTransitioning {
private var state: TransitionState = .present
let interactor = Interactor()
func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? {
let presentationController = PresentationController(presentedViewController: presented, presenting: presenting)
presentationController.interactor = interactor
return presentationController
}
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
return 0.3
}
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
let container = transitionContext.containerView
let duration = transitionDuration(using: transitionContext)
switch state {
case .present:
present(duration: duration, container: container, transitionContext: transitionContext)
case .dismiss:
dismiss(duration: duration, container: container, transitionContext: transitionContext)
}
}
private func present(duration: TimeInterval, container: UIView, transitionContext: UIViewControllerContextTransitioning) {
let from = transitionContext.viewController(forKey: .from)!
let to = transitionContext.viewController(forKey: .to)!
let toFinalFrame = transitionContext.finalFrame(for: to)
container.insertSubview(to.view, aboveSubview: from.view)
to.view.frame = CGRect(x: 0, y: toFinalFrame.height, width: toFinalFrame.width, height: toFinalFrame.height)
UIView.animate(withDuration: duration, animations: {
to.view.frame = CGRect(x: 0, y: 0, width: toFinalFrame.width, height: toFinalFrame.height)
}) { (_) in
transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
}
}
private func dismiss(duration: TimeInterval, container: UIView, transitionContext: UIViewControllerContextTransitioning) {
let from = transitionContext.viewController(forKey: .from)!
let fromFinalFrame = transitionContext.finalFrame(for: from)
UIView.animate(withDuration: duration, animations: {
from.view.frame = CGRect(x: 0, y: container.bounds.height, width: fromFinalFrame.width, height: fromFinalFrame.height)
}) { (_) in
transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment