Mientras investigaba una fuga de memoria, descubrí un problema relacionado con la técnica de llamar setRootViewController:
dentro de un bloque de animación de transición:
[UIView transitionWithView:self.window
duration:0.5
options:UIViewAnimationOptionTransitionFlipFromLeft
animations:^{ self.window.rootViewController = newController; }
completion:nil];
Si el controlador de vista anterior (el que se está reemplazando) presenta actualmente otro controlador de vista, entonces el código anterior no elimina la vista presentada de la jerarquía de vistas.
Es decir, esta secuencia de operaciones ...
- X se convierte en controlador de vista raíz
- X presenta Y, por lo que la vista de Y está en pantalla
- Usando
transitionWithView:
para hacer de Z el nuevo controlador de vista raíz
... se ve bien para el usuario, pero la herramienta Jerarquía de vista de depuración revelará que la vista de Y todavía está detrás de la vista de Z, dentro de a UITransitionView
. Es decir, después de los tres pasos anteriores, la jerarquía de vistas es:
- UIWindow
- UITransitionView
- UIView (vista de Y)
- UIView (vista de Z)
- UITransitionView
Sospecho que esto es un problema porque, en el momento de la transición, la vista de X no es realmente parte de la jerarquía de vista.
Si envío dismissViewControllerAnimated:NO
a X inmediatamente antes transitionWithView:
, la jerarquía de vista resultante es:
- UIWindow
- UIView (vista de X)
- UIView (vista de Z)
Si envío dismissViewControllerAnimated:
(SÍ o NO) a X, luego realizo la transición en el completion:
bloque, entonces la jerarquía de vista es correcta. Desafortunadamente, eso interfiere con la animación. Si anima el despido, pierde tiempo; si no está animando, parece roto.
Estoy intentando algunos otros enfoques (por ejemplo, crear una nueva clase de controlador de vista de contenedor para que sirva como mi controlador de vista raíz) pero no he encontrado nada que funcione. Actualizaré esta pregunta sobre la marcha.
El objetivo final es hacer la transición de la vista presentada a un nuevo controlador de vista raíz directamente y sin dejar jerarquías de vista perdidas.
UIWindow
es cambiarlo, pero no he tenido tiempo de experimentar mucho.