2014-09-15 15 views
23

Così ho avuto una soluzione completa di lavoro in iOS7 che visualizza un LoginViewController tramite presentViewController in didFinishLaunching di AppDelegate.presentViewController in AppDelegate con ritardo in iOS8

Fondamentalmente sto facendo qualcosa di simile:

UIViewController *backgroundViewController = ... 
self.window.rootViewController = backgroundViewController; 
[self.window makeKeyAndVisible]; 

[self.window.rootViewController presentViewController:loginViewController 
              animated:NO ...] 

In iOS 8 vedo un salto. Per prima cosa vedo lo sfondoViewController quindi dopo circa 1 secondo circa appare il login.

Quindi, come posso evitare questo salto in iOS8?

Sto vedendo che sono a ton di developers con questo kind of problem ma ancora non ha trovato una soluzione.

+0

Hai trovato una soluzione? Ho visto lo stesso problema con iOS 8 su iPhone 5S. Ma il simulatore Xcode 6 mostra una normale animazione su simulatori iPhone 6/6 +. – marsant

+0

Anche cercando una soluzione – SomeGuy

+0

Il simulatore ha anche quel problema, ma non lo si può vedere così chiaramente perché è più veloce. L'unica soluzione che ho trovato è quella di creare personalmente quell'animazione, tramite un controller di visualizzazione contenitore. Tuttavia, la mia soluzione ha alcuni problemi con tabviewcontrollers:/(viewDidAppear non viene chiamato quando cambiamo i viewcontrollers) –

risposta

0

ho anche affrontato lo stesso problema in iOS 8 e ho trovato questa soluzione:

ABCViewController *obj = [[ABCViewController alloc] initWithNibName:@"ABCViewController" bundle:nil];       

CATransition *transition = [CATransition animation]; 
transition.duration = 0.4; 
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
transition.type = kCATransitionMoveIn; 
transition.subtype = kCATransitionFromBottom; 
transition.delegate = self; 
[self.navigationControler.view.layer addAnimation:transition forKey:nil]; 
[appDelegate.navigationControler obj animated:NO]; 
obj = nil; 

Spero che questa soluzione può aiutare!

1

È possibile impostare la finestra su un'istanza di un controller temporaneo.

self.window.backgroundColor = [UIColor whiteColor]; //do some styling etc. 
self.window.rootViewController = [LoginViewController new]; 
[self.window makeKeyAndVisible]; 

Dal controller set (LoginViewController) è possibile trasferire il controller di accesso reale con la transizione desiderata. Una volta terminata la sequenza di accesso, è possibile effettuare una transizione dal controller di accesso al controller di visualizzazione radice dell'applicazione predefinito.

[UIView transitionWithView:[AppGlobal sharedApp].applicationWindow 
    duration:0.75 
    options:UIViewAnimationOptionTransitionFlipFromLeft 
    animations:^{ 
    [AppGlobal sharedApp].applicationWindow.rootViewController = [AppRootViewController new]; 
    } completion:nil]; 
2

Ho una soluzione rapida hacky:

//Make a screenshot of the ViewController first, or use a real image if you want 

__block UIImageView *fakeImageView = [[UIImageView alloc] initWithImage:image]; 
fakeImageView.frame = vc.view.frame; 
[self.view addSubview:fakeImageView]; 

[self presentViewController:vc animated:animated completion:^{ 
    [fakeImageView removeFromSuperview]; 
    fakeImageView = nil; 
}]; 

Non è bene per il lungo termine, ma può risolvere rapidamente questo problema senza cambiare troppo codice.

In attesa di soluzioni migliori.

17

anche un hack (per ora), ma solo una riga di codice

Aggiungere la vista del controller della vista che si sta presentando alla finestra prima della presentazione

UIViewController *viewController = [[UIViewController alloc] init]; 
[viewController.view setBackgroundColor:[UIColor greenColor]]; 

// Temporary iOS8 fix for 'presentation lag' on launch 
[self.window addSubview:viewController.view]; 

[self.window.rootViewController presentViewController:viewController animated:NO completion:nil]; 

Se si sta presentando un controller di navigazione piuttosto che aggiungere la vista del controller di navigazione invece del suo controller di visualizzazione superiore.

+0

Funziona. ma la barra di stato diventa un po 'funky. – markturnip

+0

@markturnip è quello per quanto riguarda il colore? Ho notato che funziona meglio se il colore della barra di stato tra entrambi i controller di visualizzazione è lo stesso, stai ottenendo altri comportamenti strani con la barra di stato? – SomeGuy

+0

Funziona ma come menzionato da @markturnip la barra di stato cambia colore =/ –

-3

questo dovrebbe funzionare: chiamata [vista loginViewController] prima di presentarla.