// // PauseStoryboardSegue.swift // Delta // // Created by Riley Testut on 12/21/15. // Copyright © 2015 Riley Testut. All rights reserved. // import UIKit class PauseStoryboardSegue: UIStoryboardSegue { fileprivate let animator: UIViewPropertyAnimator fileprivate 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.destination.transitioningDelegate = self self.destination.modalPresentationStyle = .custom self.destination.modalPresentationCapturesStatusBarAppearance = true // We need to force layout of destinationViewController.view _before_ animateTransition(using:) // Otherwise, we'll get "Unable to simultaneously satisfy constraints" errors self.destination.view.frame = self.source.view.frame self.destination.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: .to)! let presentedViewController = transitionContext.viewController(forKey: .to)! 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() } }