with uiimagepickercontrollerdelegate how and iphone ios objective-c video uiimagepickercontroller

iphone - how - uiimagepickercontrollerdelegate swift 4



UIImagePickerController graba video con orientaciĆ³n horizontal (2)

¿Cómo podemos forzar al controlador UIImagePickerController a grabar video solo en modo horizontal?

Sé que esta clase debe usarse para la grabación de retratos, pero necesito tenerla en el paisaje.

He 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 de la siguiente manera:

#import "UIImagePickerController+NonRotating.h" @implementation UIImagePickerController (NonRotating) - (BOOL)shouldAutorotate { return YES; } -(NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskLandscape; } - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { 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 resultado es aceptable).

1) Comience. Botón de cancelar y grabar en las posiciones correctas, pero otros controles están equivocados. Y el video se gira.

2) Grabación. El temporizador y el video son incorrectos.

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

¿Tienes alguna idea?

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


intenta esto, puede que te ayude

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

va a funcionar ... :)


UIImagePickerController implementar un UIImagePickerController personalizado. Para eso, deberá establecer la propiedad de showsCameraControls en FALSE.

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

Una vez que haga esto, no habrá controles predeterminados visibles para usted. Tendrá que configurar botones personalizados para iniciar / detener la grabación y voltear la cámara, etc.

Ahora puede usar los métodos de inicio / detención para grabar un video:

Cuando uno hace clic en iniciar la grabación,

[self.mImagePickerController startVideoCapture];

Para detener,

[self.mImagePickerController stopVideoCapture];

Para realizar un seguimiento del cambio entre la cámara, 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 lo desee en el cambio de orientación. AppDelegate.m

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

Este es el delegado que recibe un llamado para el cambio de orientación. Puede usar el objeto de la clase particular para llamar a su método shouldAutorotate y configurar las posiciones de control de la cámara 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 intentado cubrir todos los puntos. Avísame si tienes alguna confusión. Espero eso ayude :)

1) Debe verificar la condición al hacer clic en el evento del botón de la cámara flip.

2) AppDelegate.h: declara un objeto de tu clase donde grabas tu video y creas una propiedad. Aquí estoy usando CameraViewController como ejemplo.

CameraViewController *objController;

Ahora en AppDelegate.m:

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

Ahora usa esta instancia para llamar al método shouldAutorotate como he mostrado arriba. Y devolver la orientación del paisaje:

-(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 viewWillAppear de la clase de grabación. Establecerlo como false en viewDidUnload . O puede ser viewWillAppear de otra clase.

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