2010-07-21 20 views
20

Mi aplicación se compone de una barra de herramientas y una AVCaptureVideoPreviewLayer en un fondo UIView. Me gustaría ver que giran barra de herramientas con respecto a la orientación del dispositivo, por lo que en mi principal ViewController, he implementado la función:Deshabilitar la rotación automática para una UIView

- (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 el fondo UIView (con una capa de video) también está girando, por lo que mi vista de video ahora se reproduce 90 grados a la izquierda o a la derecha ... ¡Lo que no es genial!
Así que mi pregunta es: ¿hay alguna forma de desactivar la animación de auto rotación en una UIView específica?

he visto una pregunta similar a esta: Disabling autorotate for a single UIView, pero las respuestas no se ajusta a mi problema, yo realmente necesito el fondo de la vista a no se mueven, no para evitar el problema con una especie de "animación contador ". Así que decidí sacar este tema.

¿Alguna idea?

Gracias!

+0

Tengo el mismo problema. ¿Lo resolviste? funciona con ios 6? ¿Podrías poner una respuesta completa? Muchas gracias. –

Respuesta

-2

Prueba esto:

myVideoCaptureLayer.orientationSupported = NO; 
+5

Según tengo entendido, la propiedad orientada a la orientación es de solo lectura y dice si el dispositivo puede cambiar la orientación del video. Si es verdadero, entonces se puede cambiar la propiedad "orientación" al valor correcto (AVCaptureVideoOrientationPortrait, AVCaptureVideoOrientationLandscapeLeft, ...). ¡Gracias por ponerme en la buena dirección! –

+0

¡Vaya! Se perdió la parte de solo lectura. Me alegro de que haya ayudado. – christo16

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

O estabas diciendo que desactivarlo sólo cuando un cierto punto de vista está mostrando? Si es así, puede verificar esto usando el método isDescendantOfView de UIView.

+1

Bueno, no quiero deshabilitar toda la rotación de la interfaz, solo para deshabilitarla en una UIView específica en la jerarquía de vista del viewController principal. Significa que cuando giro el dispositivo, veo que la barra de herramientas está girando, pero no la vista de video. –

+0

Este no es un método en UIView, está en UIViewController. Por lo tanto, desactivaría la rotación para toda la jerarquía de vistas. – colinta

+0

Esto es lo que estaba buscando ... – ATOzTOA

1

me encontré con el mismo problema, sin embargo, simplemente configurando la propiedad de orientación sobre AVCaptureVideoPreviewLayer no era suficiente. El problema adicional es que CALayer no es compatible con 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.

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

@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 
11

Esta publicación apuntaba en la dirección correcta. Para tener una AVCaptureVideoPreviewLayer a no girar con el dispositivo que lo envolvió en una UIView y animado que 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 un poco rotonda pero anima sin problemas. Otras vistas en la parte superior de la capa de vista previa giran automáticamente como deberían.

+0

Gracias! Eso lo hizo por mí. – KPM

+0

Cambié un poco el código de marco: CGRect f = cameraPreview.frame; cameraPreview.transform = CGAffineTransformMakeRotation (rotación); cameraPreview.frame = f; – colinta

+0

Hola, gracias por eso, ¿'auto.view.frame' no devolverá el marco de vista girado? por lo tanto, si es un paisaje, devolverá el marco del paisaje, si es un retrato, por ejemplo, un retrato, etc. Corrígeme si me equivoco. – Malloc

0

Finalmente encontré una respuesta correcta para esto. ¡No más líos con "animaciones antirrotación" y tal!

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

  • El controlador de vista de previsualización se debe establecer en no girar
  • El controlador de vista de la interfaz se debe establecer para girar a las orientaciones necesita

Lo importante es mantener las vistas separadas al agregarlas directamente a la ventana. Lo hago en el AppDelegate:

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

que pone a la vista previa de vídeo en el fondo, y luego añade la interfaz de vista sobre ella. La interfaz se puede autorrotar libremente sin afectar la vista previa.

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

Cuestiones relacionadas