iOS 7+ Swift
Swift 4:
// 2018.10.30 par: // I've updated this answer with an asynchronous dispatch to the main queue // when we're called without animation. This really should have been in the // previous solutions I gave but I forgot to add it. extension UINavigationController { public func pushViewController( _ viewController: UIViewController, animated: Bool, completion: @escaping () -> Void) { pushViewController(viewController, animated: animated) guard animated, let coordinator = transitionCoordinator else { DispatchQueue.main.async { completion() } return } coordinator.animate(alongsideTransition: nil) { _ in completion() } } func popViewController( animated: Bool, completion: @escaping () -> Void) { popViewController(animated: animated) guard animated, let coordinator = transitionCoordinator else { DispatchQueue.main.async { completion() } return } coordinator.animate(alongsideTransition: nil) { _ in completion() } } }
EDIT: I added the version of my original Swift 3 answer. In this version, I removed the example of the collaborative animation shown in the Swift 2 version, as it seems to have confused many people.
Swift 3:
import UIKit // Swift 3 version, no co-animation (alongsideTransition parameter is nil) extension UINavigationController { public func pushViewController( _ viewController: UIViewController, animated: Bool, completion: @escaping (Void) -> Void) { pushViewController(viewController, animated: animated) guard animated, let coordinator = transitionCoordinator else { completion() return } coordinator.animate(alongsideTransition: nil) { _ in completion() } } }
Swift 2:
import UIKit // Swift 2 Version, shows example co-animation (status bar update) extension UINavigationController { public func pushViewController( viewController: UIViewController, animated: Bool, completion: Void -> Void) { pushViewController(viewController, animated: animated) guard animated, let coordinator = transitionCoordinator() else { completion() return } coordinator.animateAlongsideTransition( // pass nil here or do something animated if you'd like, eg: { context in viewController.setNeedsStatusBarAppearanceUpdate() }, completion: { context in completion() } ) } }
par Nov 17 '15 at 22:00 2015-11-17 22:00
source share