una remoto remote presentador presentacion power personalizada para mando keynote distancia diapositivas desde crear controlar control con como ios objective-c cocoa-touch uikit ios8

remoto - iOS 8: pantalla en blanco después de descartar el controlador de vista con presentación personalizada



mando a distancia keynote (7)

Agregué el siguiente código al bloque de finalización de transición y me lo arregló.

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

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

El delegado de transición está configurado correctamente, se solicita el animationControllerForPresentedController y se lo pasa correctamente, y la transición se completa una vez que finaliza la animación.

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


Consejo rápido: asegúrese de que su "De" UIViewController sea lo que espera.

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

Tenía un error similar en mi código en el pasado. Puede extraer fácilmente el contexto de VC "De" correcto.

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


Este es el tipo de pregunta que la respuesta aceptada y con votos elevados engaña a la gente. Palabras largas y cortas.

En primer lugar , no use UIModalPresentationCustom, no es lo que parece. ( detail )

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

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.


Esto se debe a que lo más probable es que agregue tanto la presentación

[transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]

y el presentado

[transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]

vea los controladores en su contenedor Vea en el método (void) animateTransition: (id) transitionContext de su controlador de animación. Como está utilizando una presentación modal personalizada, el controlador de vista de presentación todavía se muestra debajo del controlador de vista presentado . Ahora, dado que aún está visible, no es necesario agregarlo a la vista de contenedor. En su lugar, solo agregue el controlador de vista presentado a containerView. Debería verse así dentro de su método animateTransition:

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 }



Tal vez la jerarquía de vistas tenga errores con el nuevo Xcode o tal vez sea un poco diferente con iOS8. Este código me funcionó. Agréguelo mientras descarta el controlador en el método animateTransition: transitionContext.

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


Tuve el mismo problema, y ​​lo que me causó el problema 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 }) }