iOS 8 – Pantalla en blanco después de despedir a la vista controlador con presentación personalizada

Al desestimar varios de vista de controladores usando UIModalPresentationCustom, la pantalla se pone en negro después de que el controlador de vista es despedido, como si todos los de la vista de los controladores habían sido retirados de la vista de jerarquía.

La transición delegado se establece correctamente, el animationControllerForPresentedController se le solicite, y pasa correctamente, y la transición se completa una vez que la animación es más.

Este código funciona a la perfección cuando se compila con el SDK de iOS 7, pero se rompe cuando se compila con iOS 8b5

  • Estoy usando Xcode 6 GM y conseguir un comportamiento similar, excepto que la pantalla es de color blanco (mi ventana tiene un fondo blanco de color). El código funciona bien en iOS 7. He inspeccionado la vista con Revelar y la ventana está vacía.
  • Xcode 6 GM también aquí y ver el comportamiento de la misma. Con la incorporada en la vista de explosión, me parece sólo un UIWindow y UITextEffectsWindow después de la transición. Todo lo demás se ha ido.
InformationsquelleAutor jaggedcow | 2014-08-31

7 Kommentare

  1. 178

    Esto es debido a que usted es más probable que la adición de las dos de la presentación de

    [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]

    y los presentados

    [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]

    vista a los controladores de tu containerView en la (void)animateTransition:(id )transitionContext método de la animación controlador. Puesto que usted está utilizando una costumbre modal presentación, el la presentación de controlador de vista de aún se muestra debajo de la presentado controlador de vista de. Ahora, ya que todavía es visible que no es necesario añadir al contenedor de vista. En lugar sólo añadir que el controlador de vista de a la containerView. Debería ser algo como esto en el interior de su animateTransition: método

    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
    }
    • Esta es la respuesta correcta y debe ser aceptado. Había un bug en iOS 7, que se fija en iOS 8. La solución anterior funciona perfectamente en iOS 7 y 8. Gracias DJSK para señalar esto, pasado algún tiempo de averiguar cómo obtengo una pantalla en blanco.
    • Estoy de acuerdo con @StasZhukovskiy. Esto resuelve el problema. Otro problema que encontramos es que la presentada despedidos ViewController fugas en iOS7.0, aunque no 7.1 o 8…
    • Me alegra saber que trabajó para usted.
    • Al parecer, esta no es la respuesta correcta – de acuerdo a la UIViewControllerContextTransitioning encabezado debemos utilizar -viewForKey método para obtener los puntos de vista. Por desgracia, con el estilo de presentación de UIModalPresentationCustom causas -viewForkey para devolver nil en algunos casos, que aparentemente es el comportamiento deseado…. Echa un vistazo bcherry‘s respuesta sobre here.
    • No sé, pero por alguna razón no puedo ver la vista del controlador que presenta mi punto de vista controlador después de dimiss
    • el uso de [transitionContext viewControllerForKey:UITransitionContextFromViewControllerkey].ver o [transitionContext viewForKey:UITransitionContextFromView] no importa. Son exactamente la misma cosa. El problema cuando se utiliza una costumbre modal de transición, es que (en iOS8) si se agrega el fromView a la animación controlador, no se entrega a la jerarquía originales cuando finalice la animación. Usted puede manualmente devolverlo después, o usted puede elegir para no añadir nada.
    • Yo estaba citando de Apple docs. El encabezado dice expresamente a no utilizar el viewControllerForKey:UITransitionContextFromViewControllerKey para obtener la vista.
    • No es que sólo si su edificio para iOS8 sólo y no funcionará si se desea orientar a iOS7 y iOS8 juntos?
    • ¿Tu post contestar mi otra pregunta hay? Gracias
    • Sí, esta solución se aplica y en mi opinión es el más fácil. Sin embargo, DanZimm la solución funciona igual de bien, pero usted tendría que agregar una declaración de si en su animación controlador de clase de objeto para determinar qué versión de iOS se ejecuta la aplicación. A continuación, agregue las vistas a la animación controlador de objeto utilizando el Controlador de Vista de Transición Claves para iOS7 y la Vista de Transición Claves para iOS8.
    • Esta es la exacta solución para el problema que estaba teniendo. El problema que se planteaba era llamar a despedir a la vista controlador con o sin animación personalizada después de la presentación de una animación personalizada, podría causar la pantalla para regresar. La eliminación de añadir tanto los presentó y presentar solucionado el problema. Incluso causó múltiples puntos de vista constantemente de la pila con la desentendida. Esta revisión fue genial. Gracias!
    • Te amo

  2. 20

    Este es el tipo de pregunta que la alta votos & aceptado responder a engañar a la gente. Las palabras largas corto.

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

    En segundo lugar, hay un nuevo método para recuperar desde/a las Vistas en animateTransition, no usar algo como ‘fromVC.ver’ más. (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 en negro debe desaparecer.

    • Definitivamente esta es la manera correcta para lograr esto si usted está en desarrollo para versiones específicas de iOS 8 o superior. La respuesta que siempre es sólo una manera fácil de lograr lo mismo sin tener que comprobar o específicos, mientras que también acomodar a iOS7.
    • cómo conseguir transitionContext ?
  3. 2

    He añadido el código siguiente a la finalización de transición del bloque y se fija 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 sharedApplication] keyWindow] sendSubviewToBack:toViewController.view];
    
        //Complete the transition
        [transitionContext completeTransition:YES];
    }];
  4. 2

    Quizás el punto de vista de la jerarquía es el buggy con el nuevo Xcode o tal vez es un poco diferente, es iOS8. Este código funcionó para mí. Añadirlo al mismo tiempo rechazar el controlador en animateTransition: transitionContext método.

    [[UIApplication sharedApplication].keyWindow addSubview:toViewController.view];
    toViewController.view.userInteractionEnabled = YES;
    • Puede que no un bug en iOS pero en nuestro propio código. ¿Usted se propuso modalPresentationStyle a UIModalPresentationCustom, pero no se implementa el presentationControllerForPresentedviewcontroller método? Ver aquí: stackoverflow.com/a/25655575/466965
  5. 0

    Sugerencia: asegúrese de que el «De» UIViewController es lo que usted está esperando.

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

    Había un fallo similar en mi código en el pasado. Usted puede tirar de la derecha «De» VC contexto.

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

    Tuve el mismo problema, y lo que causó el problema para mí es que no me ajuste de la toViewController del cuadro final. Véase 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
        })
    } 

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea