UIImagePickerController graba video con orientación horizontal

¿Cómo podemos forzar al controller UIImagePickerController para grabar video solo en modo horizontal?

Sé que esta class debería usarse para grabar retratos, pero necesito tenerla en el paisaje.

Han encontrado varias preguntas similares, pero no hay ninguna solución que funcione para mí (iOS 6.1).

Por ejemplo, la observación de la orientación del dispositivo no funciona para mí (esta respuesta: https://stackoverflow.com/a/2147584/775779 )

Si implemento la categoría UIImagePickerController como la siguiente:

#import "UIImagePickerController+NonRotating.h" @implementation UIImagePickerController (NonRotating) - (BOOL)shouldAutorotate { return YES; } -(NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskLandscape; } - (UIInterfaceOrientation)prefernetworkingInterfaceOrientationForPresentation { return UIInterfaceOrientationLandscapeRight; } @end 

casi funciona, pero veo un comportamiento extraño de algunos controles y una orientación de video incorrecta durante la grabación (el video de resultado está bien).

1) Inicio. Cancele y registre el button en las posiciones correctas, pero otros controles están equivocados. Y el video gira. introduzca la descripción de la imagen aquí

2) Grabación. El timer y el video son incorrectos. introduzca la descripción de la imagen aquí

3) Grabación terminada. ¡todo bien! y el video del resultado es correcto.

introduzca la descripción de la imagen aquí

¿Tienes alguna idea?

ACTUALIZACIÓN Necesito bloquear la pantalla en orientación horizontal durante el process de grabación.

Necesita implementar un UIImagePickerController personalizado. Para eso, necesitará configurar la propiedad de showsCameraControls para que showsCameraControls a FALSE.

 self.mImagePickerController.showsCameraControls = NO; self.mImagePickerController.wantsFullScreenLayout = YES; 

Una vez que hagas esto, no habrá controles pnetworkingeterminados para ti. Deberá configurar botones personalizados para iniciar / detener la grabación y mover la camera, etc.

Ahora, puede usar los methods de inicio / detención para grabar un video:

Cuando se hace clic en iniciar la grabación,

 [self.mImagePickerController startVideoCapture]; 

Para detener,

 [self.mImagePickerController stopVideoCapture]; 

Para mantener un logging del cambio entre la camera, puede usar una bandera

 if (self.mImagePickerController.cameraDevice == UIImagePickerControllerCameraDeviceRear) { self.mImagePickerController.cameraDevice = UIImagePickerControllerCameraDeviceFront; isFrontCamera = YES; } else { self.mImagePickerController.cameraDevice = UIImagePickerControllerCameraDeviceRear; isFrontCamera = NO; } 

Puede configurar los controles como desee en el cambio de orientación. AppDelegate.m

 -(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 

Este es el delegado al que se le pide cambio de orientación. Puede usar el object de la class particular para llamar a su método shouldAutorotate y configurar las posiciones de control de la camera según la orientación.

 -(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { [self.objController shouldAutorotate]; return UIInterfaceOrientationMaskAll; } 

Ahora dentro de cameraviewcontroller.m

 -(BOOL)shouldAutorotate { UIInterfaceOrientation interfaceOrientation = [[UIDevice currentDevice]orientation]; if(interfaceOrientation == UIInterfaceOrientationPortrait) { // your controls setup } else { // view accordingly for landscape } } 

He tratado de cubrir todos los puntos. Avíseme si tiene alguna confusión. Espero eso ayude 🙂

1) Debe verificar la condición en el evento de clic del button de la camera giratoria.

2) AppDelegate.h: Declare un object de su class donde grabe su video y cree una propiedad. Aquí estoy usando CameraViewController como ejemplo.

 CameraViewController *objController; 

Ahora en AppDelegate.m:

 self.objController = [[CameraViewController alloc]initWithNibName:@"CameraViewController" bundle:nil]; 

Ahora use esta instancia para llamar al método shouldAutorotate como he mostrado anteriormente. Y devuelva la orientación horizontal:

 -(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { if(isOptionScreenActive == YES) { [self.shareController shouldAutorotate]; return UIInterfaceOrientationMaskLandscape; } else { [self.anotherController shouldAutorotate]; return UIInterfaceOrientationMaskPortrait; } } 

Aquí isOptionScreenActive es un flag que se establece en la viewWillAppear de la class de grabación. Establezca false en viewDidUnload . O puede ser viewWillAppear de otra class.

3) He usado cameraviewcontroller.m solo como un ejemplo. Refleja tu class de grabación. También en el método shouldAutorotate la class de grabación de shouldAutorotate , si la orientación detectada es vertical, simplemente regrese NO. De esta forma, la interfaz de usuario no cambiará y solo podrá mantener la interfaz de usuario en el paisaje.

pruebe esto el día que lo ayude

 - (BOOL)shouldAutorotate { return NO; } -(NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationLandscapeRight | UIInterfaceOrientationLandscapeLeft; } - (UIInterfaceOrientation)prefernetworkingInterfaceOrientationForPresentation { return UIInterfaceOrientationLandscapeRight; } - (BOOL)shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation)interfaceOrientation { return (interfaceOrientation == UIInterfaceOrientationLandscapeRight || interfaceOrientation == UIInterfaceOrientationLandscapeLeft); } 

Funcionará … 🙂