iOS - 使用动画更改根视图控制器

时间:2014-04-29 07:03:30

标签: ios objective-c segue

我通过按下一个连接到我想要更改的视图控制器的自定义segue的按钮来更改根视图控制器。自定义segue如下所示:

- (void)perform{
    UIViewController *source = (UIViewController *)self.sourceViewController;
    source.view.window.rootViewController = self.destinationViewController;
}

但这只会立即更改根视图控制器。我希望控制器能够在旧控制器上消失。

4 个答案:

答案 0 :(得分:21)

这样做的常见方法是:

    UIStoryboard *sb = [UIStoryboard storyboardWithName:@"YourSBName" bundle:nil];
    UIViewController *vc = [sb instantiateInitialViewController];// Or any VC with Id
    DictateITAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
    appDelegate.window.rootViewController = vc; // PLEASE READ NOTE ABOUT THIS LINE
    [UIView transitionWithView:appDelegate.window
                      duration:INTERVAL_DURATION
                       options:UIViewAnimationOptionTransitionCrossDissolve
                    animations:^{ appDelegate.window.rootViewController = vc; }
                    completion:nil];

现在有几点说明:

appDelegate.window.rootViewController = vc; // PLEASE READ NOTE ABOUT THIS LINE

您实例化的新视图控制器将以默认方向显示,即肖像。因此,如果您在横向中执行此操作,则新视图控制器将显示为纵向,然后转为横向。这条线为我解决了这个问题。

答案 1 :(得分:3)

我认为已经有很多答案,但这样的事情应该有效:

[UIView transitionWithView:self.sourceViewController.view.window
                  duration:0.5
                   options:UIViewAnimationOptionTransitionCrossDissolve
                animations:^{
                    self.sourceViewController.view.window.rootViewController = self.destinationViewController;
                } completion:^(BOOL finished) {
                    // Code to run after animation
                }];

答案 2 :(得分:2)

我需要将其转换为我当前项目的Swift 3.0。这是一种方法:

//Get the storyboard that contains the VC you want
let storyboard = UIStoryboard(name: "Main", bundle: nil)

//Get the VC you want to push onto the stack
//You can use storyboard.instantiateViewController(withIdentifier: "yourStoryboardId")
guard let vc = storyboard.instantiateInitialViewController() else { return }

//Get the current app delegate 
guard let appDel = UIApplication.shared.delegate as? AppDelegate else { return }

//Set the current root controller and add the animation with a
//UIView transition
appDel.window?.rootViewController = vc

UIView.transition(with: appDel.window!,
              duration: 0.25,
               options: .transitionCrossDissolve,
            animations: { appDel.window?.rootViewController = vc } ,
            completion: nil)

答案 3 :(得分:-3)

最简单的方法是:

[sourceViewController presentViewController:destinationViewController animated:YES completion:nil];

有关它的更多信息:https://developer.apple.com/library/ios/featuredarticles/viewcontrollerpgforiphoneos/ModalViewControllers/ModalViewControllers.html