Rotación de pantalla desde la orientación del dispositivo y una nueva UIView

¿Cuál es la forma más segura y eficaz de colocar una nueva UIView dentro de los límites de la UIWindow de la aplicación en la parte superior de la pila de vistas cuando se produce una rotación de pantalla de vertical a horizontal? Además, al volver de Paisaje a Retrato, para eliminar esta subvista.

Básicamente la App se crea como la mayoría son:

-UIVentana:

--UIView

---Todas las subvistas (incluido un controlador de vista de pestañas)

Me gustaría crear:

-UIVentana:

--UIView (nuevo, para ser colocado en la parte superior)

--UIView

---Todas las subvistas (y activadas por un controlador de vista aquí)

¿Esto esta mal? Hay sorprendentemente poca documentación para ayudar a hacer esto.

preguntado el 03 de mayo de 12 a las 17:05

3 Respuestas

Si crea un controlador de vista para contener todas sus subvistas, puede usar las funciones de rotación que se llamarán por usted:

willRotateToInterfaceOrientation:duration: y didRotateFromInterfaceOrientation:

Entonces, digamos que usas didRotateFromInterfaceOrientation, verificas

if(UIInterfaceOrientationIsLandscape(orientation))
{
    [yourView removeFromSuperView];
}
else
{
    [self.view addSubView: yourView];
}

contestado el 03 de mayo de 12 a las 18:05

¿En qué parte de la estructura de la aplicación haría esto? ¿El delegado de la aplicación? - de paso

Tomé de su publicación inicial que quería hacer esto dentro de un controlador de vista para que pusiera esta lógica dentro de la función "willRotateToInterfaceOrientation", que es parte de cualquier UIViewController. En el código anterior, "auto" se refiere al controlador de vista. Puedes ver la documentación oficial aquí aquí Se llamará a esta función cuando su aplicación gire sobre usted y lo pasará en la orientación que se cambiará a la que puede usar mi código para verificar. - rooster117

Ok, veo lo que dices, pero debido a que la aplicación usa TabView, el delegado es lo que crea el UITabViewController y lo coloca dentro de la primera vista, es decir, el 'Controlador de vista raíz' del delegado de la aplicación. Digo esto porque creo que cualquier subvista está limitada por los límites de su supervista. ¿Es esto correcto? ¿Puedo, de hecho, subvista una vista de pantalla completa? - de paso

Creo que estoy entendiendo más acerca de cuál es su problema ya que no me di cuenta de que tenía una barra de pestañas. El delegado de la aplicación tiene una función - (void)application:(UIApplication *)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation que parece que podría interceptar en el nivel de delegado de la aplicación y luego agregar una vista de pantalla completa directamente en la ventana de su aplicación ( que también cubriría la barra de pestañas) y luego, cuando gire hacia afuera, puede quitarlo. - rooster117

entonces, ¿no hay forma de llamar a una función de supervisión para que se encargue de eso? - de paso

Mira mi respuesta aquí: https://stackoverflow.com/a/4960988/202451

Debería acercarte a hacer cosas personalizadas como esa.

contestado el 23 de mayo de 17 a las 13:05

Encontré una solución de trabajo. ¿Podrías ofrecer uno mejor?

    ArtsDayAppDelegate *appDelegate = (ArtsDayAppDelegate*)[[UIApplication sharedApplication] delegate];
    UIView *landscapeView;

    if (!landscapeView) {
        landscapeView = [[UIView alloc] initWithFrame: frame];
    }

    [landscapeView setBackgroundColor:[UIColor blackColor]];
    ..add various views..
    [appDelegate.window.rootViewController.view addSubview:landscapeView];

contestado el 17 de mayo de 12 a las 19:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.