2014-04-29 5 views
8

Sto modificando il controller della vista radice premendo un pulsante collegato a un passaggio personalizzato al controller della vista che desidero modificare. Il seguente personalizzato sembra:iOS - Modifica del controller della vista radice con animazione

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

Ma questo cambia immediatamente il controller della vista radice. Mi piacerebbe che il controller svanisse sul vecchio controller.

+0

possibile duplicato di [Come faccio a fare una dissolvenza/No transizione tra controller di vista] (http://stackoverflow.com/questions/10961926/how-do-i-do -a-fade-no-transition-between-view-controller) – BangOperator

+0

il codice nasconde la barra di navigazione – user2070775

risposta

3

Penso che ci siano molte risposte per questo già, ma qualcosa di simile dovrebbe funzionare:

[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

Il modo più comune per farlo è:

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

Ora alcune note su:

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

Il nuovo controller di visualizzazione, l'istanza verrà presentato con l'orientamento predefinito, ad esempio verticale. Quindi probabilmente se lo fai in orizzontale il tuo nuovo controller di visualizzazione apparirà come ritratto e poi si trasformerà in orizzontale. Questa riga ha risolto questo problema per me.

-3

Il modo più semplice è:

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

più su di esso: https://developer.apple.com/library/ios/featuredarticles/viewcontrollerpgforiphoneos/ModalViewControllers/ModalViewControllers.html

+0

Ciò non cambia il controller di visualizzazione radice, aggiunge un nuovo controller di visualizzazione allo stack. Non libererai memoria usando più volte questo metodo. – LightMan

2

avevo bisogno di tradurre questo in Swift 3.0 per il mio progetto in corso. Ecco un modo per farlo:

//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)