2014-04-29 15 views
8

Zmieniam kontroler widoku głównego, naciskając przycisk, który jest podpięty do niestandardowej ścieżki do kontrolera widoku, który chcę zmienić. Niestandardowa zmiana wygląda następująco:iOS - Zmiana kontrolera widoku root z animacją

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

Ale to natychmiast zmienia kontroler widoku głównego. Chciałbym, żeby kontroler zgasł na starym kontrolerze.

+0

możliwe duplikat [Jak zrobić Fade/nr przejścia między widokiem kontrolerów] (http://stackoverflow.com/questions/10961926/how-do-i-do -a-fade-no-transition-between-view-controllers) – BangOperator

+0

Twój kod ukrywa pasek nawigacyjny – user2070775

Odpowiedz

3

Myślę, że istnieje wiele odpowiedzi na to już, ale coś jak to powinno działać:

[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 
       }]; 
20

Wspólna sposobem na to jest:

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]; 

Teraz kilka uwag na temat:

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

Nowy kontroler widoku, twoje wystąpienie zostanie przedstawione w domyślnej orientacji tj. Portret. Prawdopodobnie, jeśli zrobisz to w krajobrazie, twój nowy kontroler widoku pojawi się jako portret, a następnie zmieni się w krajobraz. Ta linia naprawiła dla mnie ten problem.

2

Musiałam tłumaczyć to pod Swift 3.0 dla mojego obecnego projektu. Oto sposób, aby to zrobić:

//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) 
Powiązane problemy