ios8 appdelegate presentviewcontroller

presentViewController en AppDelegate con retraso en iOS8



(5)

Así que tuve una solución de trabajo completa en iOS7 que muestra un LoginViewController a través de presentViewController en didFinishLaunching del AppDelegate.

Básicamente estoy haciendo algo como esto:

UIViewController *backgroundViewController = ... self.window.rootViewController = backgroundViewController; [self.window makeKeyAndVisible]; [self.window.rootViewController presentViewController:loginViewController animated:NO ...]

En iOS8 veo un salto. Primero veo el backgroundViewController y luego, después de aproximadamente 1 segundo, aparece el inicio de sesión.

Entonces, ¿cómo puedo evitar este salto en iOS8?

Estoy viendo que hay muchos developers con este tipo de problema pero que aún no han encontrado una solución.


Esto debería funcionar: llame a [loginviewController view] antes de presentarlo.


Puede configurar la ventana a una instancia de un controlador temporal.

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

Desde el controlador establecido (LoginViewController) puede presionar su controlador de inicio de sesión real con la transición deseada. Una vez que finaliza la secuencia de inicio de sesión, puede hacer una transición desde el controlador de inicio de sesión al controlador predeterminado de la vista raíz de la aplicación.

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


También enfrenté el mismo problema en iOS8 y encontré esta solución:

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;

Espero que esta solución te pueda ayudar!


También un hack (por ahora), pero solo una línea de código.

Agregue la vista del controlador de vista que está presentando a la ventana antes de la presentación

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

Si está presentando un controlador de navegación, agregue la vista del controlador de navegación en lugar de su controlador de vista superior.


Tengo una solución rápida 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; }];

No es bueno para el largo plazo, pero puede solucionar rápidamente este problema sin cambiar demasiado el código.

Esperando mejores soluciones.