Skip to content

Instantly share code, notes, and snippets.

@k3zi
Last active May 3, 2017 07:08
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save k3zi/9ab2e57381349dcd7fd9abd6e029430b to your computer and use it in GitHub Desktop.
Save k3zi/9ab2e57381349dcd7fd9abd6e029430b to your computer and use it in GitHub Desktop.
A basic transition that properly pushes off transparent views
import UIKit
class MPNavigationAnimatedTransitiion: NSObject, UIViewControllerAnimatedTransitioning {
let operation: UINavigationControllerOperation
init(operation: UINavigationControllerOperation) {
self.operation = operation
}
@objc func transitionDuration(transitionContext: UIViewControllerContextTransitioning?) -> NSTimeInterval {
return Constants.UI.Animation.controllerPushPop
}
@objc func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
let container = transitionContext.containerView()
guard let fromVC = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey), toVC = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey) else {
return
}
let fromView = fromVC.view
let toView = toVC.view
let containerWidth = container.frame.width
var toInitialFrame = container.frame
var fromDestinationFrame = fromView.frame
if operation == .Push {
toInitialFrame.origin.x = containerWidth
toView.frame = toInitialFrame
fromDestinationFrame.origin.x = -containerWidth
} else if operation == .Pop {
toInitialFrame.origin.x = -containerWidth
toView.frame = toInitialFrame
fromDestinationFrame.origin.x = containerWidth
}
toView.userInteractionEnabled = false
if !container.subviews.contains(toView) {
container.addSubview(toView)
}
UIView.animateWithDuration(Constants.UI.Animation.controllerPushPop, delay: 0.0, usingSpringWithDamping: 1000, initialSpringVelocity: 1, options: [], animations: {
toView.frame = container.frame
fromView.frame = fromDestinationFrame
}) { (finished) in
toView.frame = container.frame
toView.userInteractionEnabled = true
fromView.removeFromSuperview()
transitionContext.completeTransition(true)
}
}
}
class MyViewController: UIViewController, UINavigationControllerDelegate {
func navigationController(navigationController: UINavigationController, animationControllerForOperation operation: UINavigationControllerOperation, fromViewController fromVC: UIViewController, toViewController toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
return MPNavigationAnimatedTransitiion(operation: operation)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment