rotar rotacion quiero que plus pantalla gire girar gira desactivar iphone cocoa-touch

rotacion - iPhone-UIViewController no gira cuando cambia la orientación del dispositivo



rotar pantalla iphone 6 (9)

Tengo mi propio UIViewController, que contiene un UIScrollView con un UIImageView como subvista. Me gustaría hacer que la imagen gire automáticamente cuando cambie la orientación del dispositivo, pero parece que no funciona ...

En el archivo de encabezado, tengo;

@interface MyViewController : UIViewController <UIScrollViewDelegate> { IBOutlet UIScrollView *containerView; UIImageView *imageView; }

Estos componentes se inicializan en la función loadView como se muestra a continuación;

containerView = [[UIScrollView alloc] initWithFrame:frame]; NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://..."]]; UIImage *image = [[UIImage alloc] initWithData:data]; imageView = [[UIImageView alloc] initWithImage:image]; [image release]; [containerView addSubview:imageView];

Y agregué el siguiente método, suponiendo que eso es todo lo que necesito para hacer que la vista gire automáticamente ...

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return YES; }

MyViewController se carga bien con la imagen que he especificado para capturar de la URL, y se llama a la función shouldAutorotate ... con la UIInterfaceOrientation correcta, cuando cambio también el dispositivo.

Sin embargo, el método didRotateFromInterfaceOrientation no se llama, y ​​la imagen no parece rotar por sí misma ... ¿Podría alguien indicar qué debo agregar o qué he hecho mal aquí?

¡Gracias por adelantado!


Me he dado cuenta de que existen problemas al girar una UIView que no es la primera o única vista como un elemento directo de la ventana principal.

Por lo tanto, si su UIView es parte de un Controlador de navegación o un Controlador de vista de pestaña, también deberá anular la opción Orientación de rotación automática a Interfaz en el Controlador de navegación o Controlador de vista de pestaña.

Además: el uso de [UIApplication setStatusBarOrientation] ayuda a evitar las cosas si / cuando debe hacerlo manualmente.


Para que este tipo de cosas funcionen en mi aplicación, tuve que anular

- (void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { [self layoutSubviews]; }

y también layoutSubviews

- (void)layoutSubviews { NSLog(@"layoutSubviews called"); ...recalc rects etc based on the new self.view.bounds... }

No estoy seguro de que esto sea absolutamente necesario, pero funcionó para mí.


Algunas veces, si agrega una subvista a una vista, es su responsabilidad asegurarse de que los métodos se pasen a la subvista; Hace un par de días escribí una breve publicación sobre esto. Por ejemplo, si tiene un UIViewController y agrega un UINavigationController como subvista, debe agregar este código al UIViewController si desea que viewWillAppear:animated: se llame cuando aparece UINavigationController.view :

-(void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [projectNavigationController viewWillAppear:animated]; }

Puede ser que la willRotateToInterfaceOrientation también deba didRotateFromInterfaceOrientation método willRotateToInterfaceOrientation y didRotateFromInterfaceOrientation; No estoy muy seguro de esto, pero pruébalo.


Puede que esta no sea la respuesta correcta para usted, porque no especifica el contexto en el que se encuentra UIViewController, pero acabo de encontrar una información importante en la documentación de Apple que explica el problema similar que estoy teniendo.

Los controles de la barra de pestañas admiten una orientación vertical de forma predeterminada y no giran a una orientación horizontal a menos que todos los controladores de vista raíz admitan dicha orientación. Cuando se produce un cambio en la orientación del dispositivo, el controlador de la barra de pestañas consulta su matriz de controladores de visualización. Si alguno de ellos no admite la orientación, el controlador de la barra de pestañas no cambia su orientación.


Me acabo de enterar de esto teniendo un problema similar. Tengo una serie de controladores de vista / vistas complejas, todos rotan perfectamente y no pude entender por qué el nuevo que acabo de agregar no estaba girando. Después de MUCHO prueba y error, la razón fue que no estaba llamando al método init (es el método init estándar) cuando se asigna el controlador de visualización; por ejemplo, yo estaba haciendo

m_timerViewController = [TimerViewController alloc];

en lugar de

m_timerViewController = [[TimerViewController alloc] init];


Esto se discute en Apple Technical Q & A QA1688 .

A veces, si se acumulan varias vistas una encima de la otra por algún motivo , es posible que el otro controlador no reciba el evento de rotación.

[myWindow addSubview:primaryViewController.view]; [myWindow addSubview:anotherController.view];

Una forma perezosa (no es un buen diseño) para arreglar esto es solo agregar una subvista en la ventana, pero inicializar el controlador múltiple en el delegado de la aplicación. Luego, cuando necesite cambiar la ventana, elimine la vista actual y agregue la vista que desea

[self.view removeFromSuperview]; AppDelegate *dg = (AppDelegate *)[[UIApplication sharedApplication] delegate]; [[dg window] addSubview:[[dg viewController] view]];


Para expandir la publicación de jonoogle. Tuve un error similar. Mi vista tiene una punta y mi init personalizado:

- (id)initWithCategory:(Category *)category inManagedObjectContext:context{

no incluyó la llamada para iniciar el plumín.

self = [super initWithNibName:nil bundle:nil];

Agregar esa línea hizo que mi vista girara como se suponía.


Copié esto de este enlace

Y funciona para mí ... La razón por la que he agregado esto aquí es para que sea fácil de encontrar para otros. Me llevó muchas horas encontrar esta solución:

Cree un nuevo conjunto de archivos de clase del tipo UIViewController, entre en el archivo .h de esta clase y cambie esta línea

@implementation MyTabBarController: UIViewController {} @end

a algo como esto

@implementation MyTabBarController: UITabBarController{ }

Ahora ve al archivo nib y haz clic en el objeto UITabBarController y ve a la pestaña de identidad, y hazlo Class MyTabBarController.

ahora en MyTabBarController.m asegúrese de que esté dentro.

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)io { return YES; }

Probablemente pueda deshacerse de todo lo demás allí si lo desea.


¡solo haz esto si quieres rotar de paisaje a retrato!

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return (interfaceOrientation == UIInterfaceOrientationPortrait); }