GBA002/Delta/Game Selection/Segues/InitialGamesStoryboardSegue.swift
2016-11-25 01:09:02 -06:00

108 lines
3.8 KiB
Swift

//
// InitialGamesStoryboardSegue.swift
// Delta
//
// Created by Riley Testut on 8/7/16.
// Copyright © 2016 Riley Testut. All rights reserved.
//
import UIKit
class InitialGamesStoryboardSegue: UIStoryboardSegue
{
fileprivate let animator: UIViewPropertyAnimator
fileprivate var isPresenting: Bool = true
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)
super.init(identifier: identifier, source: source, destination: destination)
}
override func perform()
{
self.destination.transitioningDelegate = self
self.destination.modalPresentationStyle = .custom
self.destination.modalPresentationCapturesStatusBarAppearance = true
super.perform()
}
}
extension InitialGamesStoryboardSegue: UIViewControllerTransitioningDelegate
{
func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning?
{
self.isPresenting = true
return self
}
func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning?
{
self.isPresenting = false
return self
}
}
extension InitialGamesStoryboardSegue: UIViewControllerAnimatedTransitioning
{
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval
{
return self.isPresenting ? 0.0 : self.animator.duration
}
func animateTransition(using transitionContext: UIViewControllerContextTransitioning)
{
if self.isPresenting
{
self.animatePresentationTransition(using: transitionContext)
}
else
{
self.animateDismissalTransition(using: transitionContext)
}
}
func animatePresentationTransition(using transitionContext: UIViewControllerContextTransitioning)
{
transitionContext.sourceViewController.beginAppearanceTransition(false, animated: false)
transitionContext.destinationView.alpha = 0.0
transitionContext.destinationView.frame = transitionContext.destinationViewFinalFrame!
transitionContext.containerView.addSubview(transitionContext.destinationView)
UIView.animate(withDuration: 0.3, animations: {
transitionContext.destinationView.alpha = 1.0
}, completion: { finished in
transitionContext.completeTransition(true)
transitionContext.sourceViewController.endAppearanceTransition()
})
}
func animateDismissalTransition(using transitionContext: UIViewControllerContextTransitioning)
{
transitionContext.destinationViewController.beginAppearanceTransition(true, animated: true)
transitionContext.destinationView.transform = CGAffineTransform(scaleX: 0.5, y: 0.5)
transitionContext.destinationView.alpha = 0.0
self.animator.addAnimations {
transitionContext.sourceView.alpha = 0.0
transitionContext.sourceView.transform = CGAffineTransform(scaleX: 2.0, y: 2.0)
transitionContext.destinationView.alpha = 1.0
transitionContext.destinationView.transform = CGAffineTransform.identity
}
self.animator.addCompletion { (position) in
transitionContext.completeTransition(position == .end)
transitionContext.destinationViewController.endAppearanceTransition()
}
self.animator.startAnimation()
}
}