5

My iPad app hace un uso intensivo de autorrotación. Esto es genial. Sin embargo, me he dado cuenta de que si la implementación predeterminada de didReceiveMemoryWarning lanza una vista oculta (como se describe en here), cuando la vista se vuelve a cargar desde el plumín y resulta que estoy en horizontal, la carga en vertical. Esto causa estragos en la interfaz hasta que gire el iPad manualmente y lo obligue a ir a la orientación correcta.¿Por qué iOS no autoriza una vista cargada desde un Nib después de ser lanzada por didReceiveMemoryWarning?

Supuse que iOS cargaría la vista en la orientación actual; eso es lo que hace cuando se inicia la aplicación. Pero no, no después de haber sido descargado por didReceiveMemoryWarning. Por qué no? ¿Y cómo puedo lograr que haga eso?

+0

¿Está la vista fuera de la jerarquía de vistas (no una subvista de la vista UIViewController)? – dstnbrkr

+0

@dbarker - No, de hecho es la vista principal de la aplicación. – theory

+0

@dbarker Ah, pero mirando con más cuidado, veo que son las subvistas de esa vista que no están giradas correctamente. Las vistas incluidas en el plumín se rotan adecuadamente. Más o menos Hrm. Algo podría estar pasando con mi método '-willAnimateRotationToInterfaceOrientation: duration:' . Tal vez no se llama porque la rotación no está animada? – theory

Respuesta

4

La respuesta, determinada gracias a los punteros de dbarker, es que los métodos de rotación del controlador de vista, incluyendo -willRotateToInterfaceOrientation:duration: y -willAnimateRotationToInterfaceOrientation:duration:, no serán llamados cuando un punto de vista se vuelve a cargar después de una aplicación por defecto de didReceiveMemoryWarning ha descargado la vista. No tengo ni idea de por qué sería diferente en el lanzamiento de aplicaciones, pero tengo una solución

Lo que hice fue para establecer una Ivar booleano, llamado unloadedByMemoryWarning, a YES en didReceiveMemoryWarning, así:

- (void) didReceiveMemoryWarning { 
    unloadedByMemoryWarning = YES; 
    [super didReceiveMemoryWarning]; 
} 

luego, en viewDidLoad, si esa bandera es cierto, me puse a NO y luego llamar a los métodos de rotación a mí mismo:

if (unloadedByMemoryWarning) { 
    unloadedByMemoryWarning = NO; 
    [self willRotateToInterfaceOrientation:self.interfaceOrientation duration:0]; 
    [self willAnimateRotationToInterfaceOrientation:self.interfaceOrientation duration:0]; 
    [self didRotateFromInterfaceOrientation:self.interfaceOrientation]; 
} 

chupa Un poco que tengo que hacer esto, pero funciona, y ahora soy menos preocupado por ser asesinado por iOS por usar demasiada memoria.

+0

Estoy enfrentando el mismo problema en mi aplicación para iPad. Es un comportamiento extraño, pero tu solución me ayudó. – sandy

+0

Intenté esa solución, pero lamentablemente no lo estoy haciendo por mi parte. Bleh ... * excava en * – Kalle

1
  1. Creo que iOS 5 podría solucionar esto.

  2. Para iOS 4.3, he tenido suerte con otra solución. Después de la carga a partir de cacao:

    [parent.view addSubview:nibView]; 
    nibView.frame = parent.view.frame; 
    [nibView setNeedsLayout]; 
    

    Si eso funcionó, que podría echar por la borda la lógica unloadedByMemoryWarning, ya que es seguro hacerlo cada carga. Obtuve el código de & (básicamente) desde here.

Cuestiones relacionadas