iOS 8: Pantalla en blanco después de descartar el controller de vista con presentación personalizada

Al descartar varios controlleres de vista con UIModalPresentationCustom , la pantalla se vuelve negra después de que se descarta el controller de vista, como si todos los controlleres de vista se hubieran eliminado de la jerarquía de vistas.

El delegado de transición se configura correctamente, se solicita y se transfiere correctamente a animationControllerForPresentedController, y la transición se completa una vez que se termina la animation.

Este código exacto funciona perfectamente cuando se comstack con el iOS 7 SDK, pero se rompe cuando se comstack con iOS 8b5

Esto se debe a que es muy probable que agregue tanto la presentación

[transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]

y el presentado

[transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]

ver los controlleres en su contenedorView en el método de transición (vacío) animateTransition: (id) deContext de su controller de animation. Dado que está utilizando una presentación modal personalizada, el controller de vista de presentación todavía se muestra debajo del controller de vista presentado . Ahora, dado que todavía está visible, no es necesario agregarlo a la vista del contenedor. En su lugar, solo agregue el controller de vista presentado a containerView. Debería verse algo así dentro de tu animateTransition: method

 UIView *containerView = [transitionContext containerView]; UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; // Boolean value to determine presentation or dismissal animation if (self.presenting){ [transitionContext.containerView addSubview:toViewController.view]; // Your presenting animation code } else { // Your dismissal animation code } 

Este es el tipo de pregunta que las personas de votos altos y respuestas aceptadas engañan. Largas palabras cortas.

En primer lugar , no utilice UIModalPresentationCustom, no es lo que parece. ( detalle )

En segundo lugar , hay un nuevo método para recuperar de / a Vistas en animateTransition, ya no uses algo como 'fromVC.view'. ( por qué )

 UIViewController *fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; UIViewController *toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; UIView *fromView = [transitionContext viewForKey:UITransitionContextFromViewKey]; UIView *toView = [transitionContext viewForKey:UITransitionContextToViewKey]; //swift let fromVC = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey) let toVC = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey) let fromView = transitionContext.viewForKey(UITransitionContextFromViewKey) let toView = transitionContext.viewForKey(UITransitionContextToViewKey) 

Ahora la pantalla negra debería desaparecer.

Parece que encontré el mismo problema, estoy usando Xcode 6 beta5.

Busqué con Google y encontré que alguien más tiene este mismo problema, y ​​dijeron que esto es un error serio en iOS 8, así que espero que Apple pueda solucionar esto pronto.

https://github.com/TeehanLax/UIViewController-Transitions-Example/issues/5

Agregué el código a continuación al bloque de finalización de transición y lo arregló para mí.

 [UIView animateWithDuration:[self transitionDuration:transitionContext] animations: ^{ // Animation code } completion: ^(BOOL finished) { // More of your code // Add the following line before completing the transition [[[UIApplication shanetworkingApplication] keyWindow] sendSubviewToBack:toViewController.view]; // Complete the transition [transitionContext completeTransition:YES]; }]; 

Tal vez la jerarquía de vista sea cochambrosa con Xcode nuevo o tal vez sea un poco diferente es iOS8. Este código funcionó para mí. Agregalo mientras descartas el controller en animateTransition: transitionContext method.

 [[UIApplication shanetworkingApplication].keyWindow addSubview:toViewController.view]; toViewController.view.userInteractionEnabled = YES; 

Sugerencia rápida: asegúrese de que su UIViewController "de" sea lo que espera.

  NSLog(@" FROM vc %@" , [[transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey] description]); 

Tuve un error similar en mi código en el pasado. Puede extraer fácilmente el context "Desde" VC.

  UIViewController *fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; fromView = [[[fromVC childViewControllers] firstObject] view]; 

Tuve el mismo problema, y ​​lo que causó el problema para mí es que no estaba configurando el marco final de toViewController. Vea el siguiente ejemplo de http://www.appcoda.com/custom-view-controller-transitions-tutorial/

 func animateTransition(transitionContext: UIViewControllerContextTransitioning) { let fromViewController = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)! let toViewController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)! let finalFrameForVC = transitionContext.finalFrameForViewController(toViewController) let containerView = transitionContext.containerView() let bounds = UIScreen.mainScreen().bounds toViewController.view.frame = CGRectOffset(finalFrameForVC, 0, bounds.size.height) containerView.addSubview(toViewController.view) UIView.animateWithDuration(transitionDuration(transitionContext), delay: 0.0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.0, options: .CurveLinear, animations: { fromViewController.view.alpha = 0.5 toViewController.view.frame = finalFrameForVC }, completion: { finished in transitionContext.completeTransition(true) fromViewController.view.alpha = 1.0 }) }