¿Cómo grabar video a pantalla en una aplicación de paisaje?

Esto me está haciendo la cabeza.

Estoy trabajando desde este proyecto de muestra: https://github.com/jj0b/AROverlayExample

Esto funciona perfectamente. El único problema es que es una aplicación de retrato. Entonces, cuando giro el dispositivo hacia el paisaje, el video sigue apareciendo como se quería, pero todas mis tags y UI ahora están de costado.

introduzca la descripción de la imagen aquí

Para solucionar esto, estoy configurando el paisaje solo en info.plist

El problema es este:

introduzca la descripción de la imagen aquí

Aquí está mi código:

- (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; assert( self.autoresizesSubviews ); CGPoint layerRectCenter = CGPointMake( CGRectGetMidX( frame ), CGRectGetMidY( frame ) ); // Initialization code self.captureSession = [[[AVCaptureSession alloc] init] autorelease]; // addVideoInput { AVCaptureDevice* videoDevice = [AVCaptureDevice defaultDeviceWithMediaType: AVMediaTypeVideo]; if (videoDevice) { NSError *error; AVCaptureDeviceInput* videoIn = [AVCaptureDeviceInput deviceInputWithDevice: videoDevice error:&error]; if ( ! error ) { if ( [self.captureSession canAddInput:videoIn] ) [self.captureSession addInput:videoIn]; else NSLog(@"Couldn't add video input"); } else NSLog(@"Couldn't create video input"); } else NSLog(@"Couldn't create video capture device"); } // addVideoPreviewLayer { self.previewLayer = [[[AVCaptureVideoPreviewLayer alloc] initWithSession: self.captureSession] autorelease]; self.previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; self.previewLayer.frame = CGRectMake(0, 0, 480, 300); self.previewLayer.orientation = AVCaptureVideoOrientationLandscapeRight; //self.previewLayer.frame = frame; [self.layer addSublayer: self.previewLayer]; } // run! [self.captureSession startRunning]; } return self; } 

No puedo entender por qué el video se está mostrando lateralmente y, a pesar de establecer específicamente el marco de las capas en el paisaje CGRectMake (0, 0, 480, 300), está saliendo al revés.

Una solución muy aseada es agregar la vista directamente a la window.

El mejor punto para hacer esto es en el controller de la vista raíz:

 // need to add the capture view to the window here: can't do it in viewDidLoad as the window is not ready at that point - (void) viewDidAppear: (BOOL) animated { self.frontCamView = [[[FrontCamView alloc] initWithFrame: [UIScreen mainScreen].bounds] autorelease]; self.view.opaque = NO; self.view.backgroundColor = [UIColor clearColor]; [self.view.window addSubview: self.frontCamView]; [self.view.window sendSubviewToBack: self.frontCamView]; } 

Luego, la implementación de la camera se ve a sí misma:

 @interface FrontCamView ( ) @property (retain) AVCaptureVideoPreviewLayer* previewLayer; @property (retain) AVCaptureSession* captureSession; @end // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @implementation FrontCamView @synthesize captureSession; @synthesize previewLayer; // - - - - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { self.captureSession = [[[AVCaptureSession alloc] init] autorelease]; // addVideoInput { AVCaptureDevice* videoDevice = [AVCaptureDevice defaultDeviceWithMediaType: AVMediaTypeVideo]; if (videoDevice) { NSError *error; AVCaptureDeviceInput* videoIn = [AVCaptureDeviceInput deviceInputWithDevice: videoDevice error:&error]; if ( ! error ) { if ( [self.captureSession canAddInput:videoIn] ) [self.captureSession addInput:videoIn]; else NSLog(@"Couldn't add video input"); } else NSLog(@"Couldn't create video input"); } else NSLog(@"Couldn't create video capture device"); } // addVideoPreviewLayer { CGRect screenRect = [UIScreen mainScreen].bounds; self.previewLayer = [[[AVCaptureVideoPreviewLayer alloc] initWithSession: self.captureSession] autorelease]; self.previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; self.previewLayer.frame = screenRect; self.previewLayer.orientation = AVCaptureVideoOrientationPortrait; [self.layer addSublayer: self.previewLayer]; } // run! [self.captureSession startRunning]; } return self; } - (void) dealloc { [self.captureSession stopRunning]; [previewLayer release], previewLayer = nil; [captureSession release], captureSession = nil; [super dealloc]; } @end