rotar rotacion quiero que plus pantalla gire girar gira desactivar iphone uiview uiinterfaceorientation

iphone - rotacion - Desactivación de la rotación automática para una vista UIV



no quiero que la pantalla de mi iphone gire (5)

Este post apuntaba en la dirección correcta. Para lograr que AVCaptureVideoPreviewLayer no gire con el dispositivo, lo envolví en una vista UIView y animé esa vista en la dirección opuesta:

- (void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { float rotation; if (toInterfaceOrientation==UIInterfaceOrientationPortrait) { rotation = 0; } else if (toInterfaceOrientation==UIInterfaceOrientationLandscapeLeft) { rotation = M_PI/2; } else if (toInterfaceOrientation==UIInterfaceOrientationLandscapeRight) { rotation = -M_PI/2; } [UIView animateWithDuration:duration animations:^{ cameraPreview.transform = CGAffineTransformMakeRotation(rotation); cameraPreview.frame = self.view.frame; }]; }

Parece una pequeña rotonda pero anima suavemente. Otras vistas en la parte superior de la capa de vista previa giran automáticamente como deberían.

Mi aplicación se compone de una barra de herramientas y un AVCaptureVideoPreviewLayer en una vista de fondo. Me gustaría ver que la barra de herramientas gire con respecto a la orientación del dispositivo, así que en mi ViewController principal, implementé la función:

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

Esto funciona bien, pero cuando se cambia la orientación de la interfaz, veo que la vista de fondo (con una capa de video) también está girando, por lo que mi vista de video se está reproduciendo 90 grados hacia la izquierda o hacia la derecha ... ¡Lo que no es realmente genial!
Entonces, mi pregunta es: ¿hay alguna manera de deshabilitar la animación de rotación automática en una vista UIV específica?

He visto una pregunta similar a esta: deshabilitar el autorotado para una sola vista UIV , pero las respuestas no se ajustan a mi problema, realmente necesito la vista de fondo para no moverme, no para solucionar el problema con una especie de "contador" animación". Así que decidí traer este tema.

Algunas ideas ?

Gracias !


Finalmente encontré una respuesta sensata para esto. ¡No más perder el tiempo con "animaciones antirrotación" y demás!

La clave es usar un UIViewController para su capa de vista previa (la vista no giratoria) y otra para la interfaz real. Configure las opciones de rotación para ambos usando shouldAutorotateToInterfaceOrientation: (el código está en las respuestas anteriores):

  • El controlador de vista previa debe configurarse para que no gire
  • El controlador de vista de interfaz debe configurarse para que gire a las orientaciones que necesita

Lo importante es mantener sus vistas separadas agregándolas directamente a la ventana. Hago esto en el AppDelegate:

[self.window addSubview:previewViewController.view]; [self.window addSubview:interfaceViewController.view]; self.window.rootViewController = interfaceViewController; [self.window makeKeyAndVisible];

Eso coloca la vista previa del video en segundo plano y luego agrega la vista de la interfaz sobre él. La interfaz es libre de autorotación sin afectar en absoluto a la vista previa.

Una cosa importante a tener en cuenta: el fondo de la vista de la interfaz debe ser transparente, de lo contrario bloquea la vista previa.


Me encontré con el mismo problema, aunque simplemente no era suficiente establecer la propiedad de orientación en AVCaptureVideoPreviewLayer. El problema adicional es que CALayer no admite los administradores de diseño en el iPhone, por lo que el marco de la capa de video puede ser incorrecto cuando se gira el dispositivo.

Arreglé esto usando una UIView personalizada para contener AVCaptureVideoPreviewLayer y luego anulé el método layoutSubviews para esta vista para asegurar que el marco de la capa de video siempre esté correctamente configurado. Este es también un buen lugar para establecer la propiedad de orientación. Es decir, mi UIView se ve como:

@implementation VideoPreview @synthesize previewLayer; - (void) layoutSubviews { if (previewLayer) { // set the correct orientation for the video layer previewLayer.orientation = [[UIDevice currentDevice] orientation]; // and set its frame to that of its parent UIView previewLayer.frame = self.bounds; } } - (void) addPreviewLayer: (AVCaptureVideoPreviewLayer *) videoLayer { previewLayer = videoLayer; [self.layer addSublayer:videoLayer]; } @end


Prueba esto:

myVideoCaptureLayer.orientationSupported = NO;


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

¿O estaba diciendo que lo deshabilite solo cuando se muestra una vista determinada? Si es así, puede verificar esto utilizando el método isDescendantOfView de UIView.