iosiphoneobjective-cuiviewanimationtransition

Change RootViewcontroller with the Push Transition effect


in my iOS App i need to change the rootviewController of the window in between of app .so when i change my rootviewcontroller dyncamically its flicking the view before its change.but what i want is to give a smooth transition when rootviewcontroller is changed.

i had tried with the following but its not the transition i want.

[UIView transitionWithView:self.window
                      duration:.8
                       options:UIViewAnimationOptionTransitionCurlUp
                    animations:^{

                        self.window.rootViewController = tabBarControllerMain;
    [self.window makeKeyAndVisible];
                    }
                    completion:NULL];

i want specific transition like navigationcontroller pushview transition.

can any body give me idea how to achieve that?


Solution

  • Based on this Apple's documentation

    UIViewController *viewControllerToBeShown=[[UIViewController alloc]init];
    
    //viewControllerToBeShown.view.frame = self.view.frame;
    
    viewControllerToBeShown.view.backgroundColor = [UIColor orangeColor];
    
    
    
    AppDelegateClass *yourAppDelegate  =(AppDelegateClass*)[UIApplication sharedApplication].delegate;
    
    
    UIView *myView1 = yourAppDelegate.window.rootViewController.view;
    
    UIView *myView2 = viewControllerToBeShown.view;
    
    myView2.frame = yourAppDelegate.window.bounds;
    
    
    [yourAppDelegate.window addSubview:myView2];
    
    
    CATransition* transition = [CATransition animation];
    transition.startProgress = 0;
    transition.endProgress = 1.0;
    transition.type = kCATransitionPush;
    transition.subtype = kCATransitionFromRight;
    transition.duration = 5.0;
    
    // Add the transition animation to both layers
    [myView1.layer addAnimation:transition forKey:@"transition"];
    [myView2.layer addAnimation:transition forKey:@"transition"];
    
    myView1.hidden = YES;
    myView2.hidden = NO;
    
    
    yourAppDelegate.window.rootViewController = viewControllerToBeShown;
    

    Swift

            guard let appDelegate = UIApplication.shared.delegate,
                let appDelegateWindow = appDelegate.window,
                let appDelegateView = window.rootViewController?.view,
                let viewContollersView = viewController.view else {
                return
            }
            viewContollersView.frame = (appDelegateWindow?.bounds)!
            appDelegate.window??.addSubview(viewContollersView)
            let transition = CATransition()
            transition.startProgress = 0
            transition.endProgress = 1.0
            transition.type = kCATransitionPush
            transition.subtype = kCATransitionFromRight
            transition.duration = 0.35
            appDelegateView.layer.add(transition, forKey: "transition")
            viewContollersView.layer.add(transition, forKey: "transition")
            appDelegateView.isHidden = true
            viewContollersView.isHidden = false
            appDelegateWindow?.rootViewController = viewController