UIViewController rotar métodos

votos
17

¿Qué objeto es responsable de dipatching de las UIViewControllerllamadas al método de rotación, es decir:

  • shouldAutorotateToInterfaceOrientation:
  • willRotateToInterfaceOrientation:duration:
  • willAnimateFirstHalfOfRotationToInterfaceOrientation:duration:
  • willAnimateSecondHalfOfRotationFromInterfaceOrientation:duration:
  • didRotateFromInterfaceOrientation:

Me imagino que es UIApplication(pero tal vez el AppDelegate o UIWindow).

La siguiente pregunta es, ¿cómo sabe el objeto con qué UIViewControllerhablar?

¿Cómo sabe cuál UIViewControllertiene su punto de vista como la subvista de la ventana?

¿Hay un mensaje que puede enviar o una propiedad que puede establecer (de algún objeto) que establece el Activo UIViewControllerpara la aplicación?

Publicado el 14/02/2009 a las 00:50
fuente por usuario
En otros idiomas...                            


4 respuestas

votos
13

Parece que UIApplicationestá enviando un mensaje al controlador de vista activa.

¿Pero cómo obtiene su instancia de View Controller estos mensajes?

El mensaje se reenvía al primer controlador de vista cuya vista se ha agregado a la UIWindowinstancia.

Esto se reduce a 3 escenarios básicos:

  1. El ViewController cuya vista se agrega directamente a la UIWindow instancia (aplicación de vista única)

  2. El controlador de navegación en una aplicación basada en navegación, luego el controlador de navegación reenvía el mensaje al controlador de vista de vistas activo.

  3. La barra de pestañas Controlador en una aplicación basada en barra de pestañas, luego el controlador de la barra de pestañas reenvía el mensaje al controlador de vista de vistas activo (o al controlador de navegación activo).

El problema que tendrá es si construye una aplicación con varias vistas, pero NO use un controlador de navegación o un controlador de barra de pestañas. Si intercambia puntos de vista dentro y fuera de la UIWindowinstancia de forma manual, no recibirá estos mensajes de manera confiable. Esto es similar a publicaciones como esta: iPhone viewWillAppear no dispara

Solo usa las convenciones de Apple para múltiples vistas y estarás bien. Espero que esto salve a alguien una o dos horas

Respondida el 19/02/2009 a las 05:49
fuente por usuario

votos
4

¿Cómo sabe qué UIViewController tiene su vista como subvista de la ventana?

La clase UIViewController mantiene un mapa estático entre las vistas y sus controladores de vista. Este mapa se consulta en algunos lugares clave dentro de CocoaTouch. En particular, [UIView nextResponder] lo consulta y devuelve el controlador si se encuentra.

Supongo que UIWindow hace la misma búsqueda con su vista raíz para saber a qué controlador reenviar los eventos de rotación. Comprobaré esto la próxima vez que buscaré algo en el desmontaje. (He invertido un tiempo en la ingeniería inversa CocoaTouch para entender cómo funcionan las cosas allí).

Respondida el 06/05/2009 a las 12:15
fuente por usuario

votos
4

Esto es todo magia de la que nunca te preocupes. Simplemente agregue la vista raíz de su controlador a la ventana, o obtenga una barra de pestañas o un controlador de navegación para que lo haga por usted, y recibirá estos mensajes.

(Pero si hurgas con el depurador, puedes llegar a la misma conclusión que tengo: hay algún tipo de tabla interna que asigna la vista de cada controlador al controlador, y los mensajes se envían según ese enlace).


Actualización: esta fue una magia realmente privada en 2009 cuando escribí esta respuesta por primera vez, pero los cambios posteriores a iOS han hecho que las API detrás de esto sean públicas. Ahora se puede acceder al controlador de vista raíz a través de la UIWindow.rootViewControllerpropiedad y el árbol de los controladores de vista descendientes se forma utilizando la UIViewController.childViewControllerspropiedad.

Los controladores de vista padre son responsables de notificar a sus hijos sobre los cambios de orientación. (No estoy seguro de cómo se notifica al controlador de la vista raíz, pero puede establecer un punto de interrupción y averiguarlo). El -shouldAutomaticallyForwardRotationMethodsmétodo decide si UIViewController hará esto por usted. Si devuelve NO, usted se convierte en responsable de hacerlo en sus -willRotateToInterfaceOrientation:duration:, -willAnimateRotationToInterfaceOrientation:duration:y -didRotateFromInterfaceOrientation:métodos.

Respondida el 14/02/2009 a las 01:42
fuente por usuario

votos
1

Tengo un problema similar.

Tengo un juego de trabajo en orientación horizontal (tanto a la izquierda y el paisaje derecha).

Con el fin de administrar una aplicación con múltiples vistas utilizo un UIViewController raíz, es decir, un maniquí con un UIViewController UIView que no hace nada. Luego agregar cualquier otro UIView a ella como una vista secundaria.

Al iniciar la aplicación, el emulador gira rápidamente a una orientación vertical, y me da cada uno de mis puntos de vista con su propiedad marco pareciendo (0, -80320480). Esto resulta en la vista que se recortan por un rectángulo 160 X 320 en el lado derecho.

Me he dado cuenta de que el - shouldAutorotateToInterfaceOrientation: Método de cada subvista sólo se le llama una vez, y eso sucede cuando se agrega a la vista raíz. Más tarde, cuando se gira el dispositivo, sólo la vista raíz recibe su método llamado.

Como era de esperar, cualquiera de los métodos willAnimate - * Las llamadas se envían sólo a la vista raíz, por lo que, definiendo cualquiera de estos métodos en subvistas no tiene sentido.

Estos métodos se llaman cada vez la orientación se cambia a una orientación aceptada por el - shouldAutorotateToInterfaceOrientation: método. Así que pensé que podía chnage propiedad marco de mis subvistas a partir de ahí.

Para lograr esto, he definido el siguiente método en mi clase RootViewController:

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration
{
    subview1_ViewController.view.frame = CGRectMake(0,0,480,320);
    subview2_ViewController.view.frame = CGRectMake(0,0,480,320);
        ...
}

No entiendo por qué la propiedad trama no se actualiza, pero sé que funciona esta solución.

Espero que esto ayude....

Respondida el 25/03/2010 a las 05:20
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more