// // PauseStoryboardSegue.swift // Delta // // Created by Riley Testut on 12/21/15. // Copyright © 2015 Riley Testut. All rights reserved. // import UIKit class PauseStoryboardSegue: UIStoryboardSegue { private let animator: UIViewPropertyAnimator private let presentationController: PausePresentationController override init(identifier: String?, source: UIViewController, destination: UIViewController) { let timingParameters = UISpringTimingParameters(mass: 3.0, stiffness: 750, damping: 65, initialVelocity: CGVector(dx: 0, dy: 0)) self.animator = UIViewPropertyAnimator(duration: 0, timingParameters: timingParameters) self.presentationController = PausePresentationController(presentedViewController: destination, presenting: source) super.init(identifier: identifier, source: source, destination: destination) } override func perform() { self.destinationViewController.transitioningDelegate = self self.destinationViewController.modalPresentationStyle = .custom self.destinationViewController.modalPresentationCapturesStatusBarAppearance = true // We need to force layout of destinationViewController.view _before_ animateTransition(using:) // Otherwise, we'll get "Unable to simultaneously satisfy constraints" errors self.destinationViewController.view.frame = self.sourceViewController.view.frame self.destinationViewController.view.layoutIfNeeded() super.perform() } } extension PauseStoryboardSegue: UIViewControllerTransitioningDelegate { func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? { return self } func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? { return nil } func presentationController(forPresented presentedViewController: UIViewController, presenting presentingViewController: UIViewController?, source: UIViewController) -> UIPresentationController? { return self.presentationController } } extension PauseStoryboardSegue: UIViewControllerAnimatedTransitioning { func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval { return self.animator.duration } func animateTransition(using transitionContext: UIViewControllerContextTransitioning) { let presentedView = transitionContext.view(forKey: UITransitionContextToViewKey)! let presentedViewController = transitionContext.viewController(forKey: UITransitionContextToViewControllerKey)! presentedView.frame = transitionContext.finalFrame(for: presentedViewController) presentedView.frame.origin.y = transitionContext.containerView().bounds.height transitionContext.containerView().addSubview(presentedView) self.animator.addAnimations { [unowned self] in presentedView.frame = self.presentationController.frameOfPresentedViewInContainerView() } self.animator.addCompletion { position in transitionContext.completeTransition(position == .end) } self.animator.startAnimation() } }