diff --git a/Sources/URLNavigator.swift b/Sources/URLNavigator.swift index 68d37e3..1170a07 100644 --- a/Sources/URLNavigator.swift +++ b/Sources/URLNavigator.swift @@ -84,6 +84,7 @@ public class URLNavigator { } } + public var window:UIWindow? // MARK: Initializing @@ -317,6 +318,52 @@ public class URLNavigator { return false } + // MARK: Make Root + public func makeRootURL(URL: URLConvertible, + from: UIWindow? = nil, + animated: Bool = true, + wrap: Bool = false) -> UIViewController?{ + guard let fromWindow:UIWindow = self.window ?? from else{ + return nil + } + + guard let viewController = self.viewControllerForURL(URL) else { + return nil + } + + return self.makeRoot(viewController,from: fromWindow, animated:animated, wrap:wrap) + } + + public func makeRoot(viewController: UIViewController, + from: UIWindow? = nil, + animated: Bool = true, + wrap: Bool = false) -> UIViewController?{ + + + var finalViewController = viewController + if wrap && !viewController.isKindOfClass(UINavigationController){ + let navigationController = UINavigationController(rootViewController: viewController) + finalViewController = navigationController + } + + guard let snapShot:UIView = self.window?.snapshotViewAfterScreenUpdates(true) else{ + return nil + } + + finalViewController.view.addSubview(snapShot) + self.window?.rootViewController = finalViewController; + UIView.animateWithDuration(animated ? 0.6 : 0 , + delay: 0, + options: UIViewAnimationOptions.CurveEaseInOut, + animations: { () -> Void in + snapShot.layer.opacity = 0; + }) { (finished) -> Void in + snapShot.removeFromSuperview() + } + + return viewController + + } // MARK: Utils diff --git a/Tests/URLNavigatorPublicTests.swift b/Tests/URLNavigatorPublicTests.swift index 65f106d..3c6dba5 100644 --- a/Tests/URLNavigatorPublicTests.swift +++ b/Tests/URLNavigatorPublicTests.swift @@ -117,13 +117,23 @@ class URLNavigatorPublicTests: XCTestCase { XCTAssertTrue(self.navigator.openURL("myapp://ping")) self.waitForExpectationsWithTimeout(1, handler: nil) } - + func testOpenURL_URLNavigable() { self.navigator.map("myapp://user/", UserViewController.self) XCTAssertFalse(self.navigator.openURL("myapp://user/1")) } + + func testMakeRoot() { + self.navigator.window = UIWindow() + self.navigator.window?.rootViewController = UIViewController() + self.navigator.map("myapp://user/", UserViewController.self) + + XCTAssert(self.navigator.makeRootURL("myapp://user/1", wrap:true ,animated:false) is UserViewController) + XCTAssert(self.navigator.window?.rootViewController is UINavigationController) + } + // MARK: Scheme func testSetScheme() {