with uiimagepickercontrollerdelegate how and ios objective-c iphone swift uiimagepickercontroller

ios - uiimagepickercontrollerdelegate - Cámara frontal en UIImagePickerController



uiimagepickercontrollerdelegate swift 4 (7)

Estoy desarrollando la aplicación de cámara frontal en iPad2 usando el UIImagePickerController .

Cuando capturo la imagen, se muestra como volteada de izquierda a derecha.

¿Cómo puedo corregir esto?

if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) { UIImagePickerController *imgPkr = [[UIImagePickerController alloc] init]; imgPkr.delegate = self; imgPkr.sourceType = UIImagePickerControllerSourceTypeCamera; imgPkr.cameraDevice=UIImagePickerControllerCameraDeviceFront; UIImageView *anImageView=[[UIImageView alloc] initWithImage:[UIImage imageNamed:[NSString stringWithFormat:@"select%d.png",val]]]; anImageView.frame = CGRectMake(0, 0, anImageView.image.size.width, anImageView.image.size.height); imgPkr.cameraOverlayView = anImageView; [theApp.TabViewControllerObject presentModalViewController:imgPkr animated:YES]; [imgPkr release]; }


Como las otras respuestas, tuve el mismo problema. Como mencionó Yonatan Betzer, basta con dar la vuelta a la imagen final que es solo la mitad de la respuesta, porque la imagen de vista previa, mostrada por el UIPickerController cuando tomas una foto con la cámara frontal, todavía está invertida (reflejada).

El guante de Yonatan Betzer funciona muy bien, pero no mencionó cómo ni dónde poner la acción para cambiar el dispositivo de la cámara.

Basado en algunos códigos de internet, creé un Pod para obtener este comportamiento deseado:

https://github.com/lucasecf/LEMirroredImagePicker

Una vez instalado, solo tiene que llamar a estas dos líneas de código junto con su UIImagePickerController :

self.mirrorFrontPicker = [[LEMirroredImagePicker alloc] initWithImagePicker:pickerController]; [self.mirrorFrontPicker mirrorFrontCamera];

Y eso es todo, simplemente así. Puede buscar más información en el archivo README del enlace github.


Ejemplo de trabajo completo en Swift , que responde a la pregunta inicial de esta publicación (probado en un iPhone 5c con iOS 8.2):

import UIKit class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate, UIActionSheetDelegate { @IBOutlet var myUIImageView: UIImageView! var myUIImagePickerController: UIImagePickerController! override func viewDidLoad() { super.viewDidLoad() } override func viewWillAppear(animated: Bool) { println("viewWillAppear(animated: Bool) method called.") super.viewWillAppear(animated) NSNotificationCenter.defaultCenter().removeObserver(self) } override func viewWillDisappear(animated: Bool) { println("viewWillDisappear(animated: Bool) method called.") super.viewWillDisappear(animated) NSNotificationCenter.defaultCenter().addObserver(self, selector: "cameraChanged:", name: "AVCaptureDeviceDidStartRunningNotification", object: nil) } /* UIImagePickerControllerDelegate Section */ func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) { if(self.myUIImagePickerController.sourceType == UIImagePickerControllerSourceType.Camera) { self.myUIImageView.image = info[UIImagePickerControllerEditedImage] as? UIImage } else { self.myUIImageView.image = info[UIImagePickerControllerOriginalImage] as? UIImage } self.dismissViewControllerAnimated(true, completion: nil) } func imagePickerControllerDidCancel(picker: UIImagePickerController) { self.dismissViewControllerAnimated(true, completion: nil) } /* You can choose to use one of the UIResponder methods: touchesBegan, touchesMoved, touchesEnded etc, in order to detect the touch on the UIImageView. */ override func touchesEnded(touches: NSSet, withEvent event: UIEvent) { let touch: UITouch? = touches.anyObject() as? UITouch if (touch?.view == myUIImageView) { println("myUIImageView has been tapped by the user.") self.takingAPictureUsingTheCamera() } } func takingAPictureUsingTheCamera() { self.myUIImagePickerController = UIImagePickerController() self.myUIImagePickerController.delegate = self // Set the delegate self.myUIImagePickerController.sourceType = UIImagePickerControllerSourceType.Camera self.myUIImagePickerController.cameraDevice = UIImagePickerControllerCameraDevice.Front // self.myUIImagePickerController.editing = true self.myUIImagePickerController.allowsEditing = true self.presentViewController(self.myUIImagePickerController, animated: true, completion: nil) } func cameraChanged(notification: NSNotification) { println("cameraChanged(notification: NSNotification) method called.") self.myUIImagePickerController.cameraViewTransform = CGAffineTransformIdentity if(self.myUIImagePickerController.cameraDevice == UIImagePickerControllerCameraDevice.Front){ self.myUIImagePickerController.cameraViewTransform = CGAffineTransformScale(self.myUIImagePickerController.cameraViewTransform, -1, 1) } } }// End class


Parece que AVCaptureDeviceDidStartRunningNotification ya no está disponible como medio para detectar cambios en el dispositivo de la cámara. Además, la propiedad cameraDevice en UIImagePickerController no funciona con KVO. Sin embargo, aún es posible detectar cambios en los dispositivos de la cámara, como se muestra a continuación (aunque no está garantizado el soporte a largo plazo para esta solución ya que estamos utilizando KVO en una propiedad que no está marcada explícitamente como compatible con KVO).

import AVFoundation var context = 0 override func viewDidLoad() { super.viewDidLoad() // Register for notifications let notificationCenter = NSNotificationCenter.defaultCenter() notificationCenter.addObserver(self, selector: #selector(handleCaptureSessionDidStartRunning(_:)), name: AVCaptureSessionDidStartRunningNotification, object: nil) notificationCenter.addObserver(self, selector: #selector(handleCaptureSessionDidStopRunning(_:)), name: AVCaptureSessionDidStopRunningNotification, object: nil) } deinit { NSNotificationCenter.defaultCenter().removeObserver(self) } func handleCaptureSessionDidStartRunning(notification: NSNotification) { guard let session = notification.object as? AVCaptureSession else { return } session.addObserver(self, forKeyPath: "inputs", options: [ .Old, .New ], context: &context) } func handleCaptureSessionDidStopRunning(notification: NSNotification) { guard let session = notification.object as? AVCaptureSession else { return } session.removeObserver(self, forKeyPath: "inputs") } override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) { if context == &self.context { if let inputs = change?[NSKeyValueChangeNewKey] as? [AnyObject], captureDevice = (inputs.first as? AVCaptureDeviceInput)?.device { switch captureDevice.position { case .Back: print("Switched to back camera") case .Front: print("Switched to front camera") case .Unspecified: break } } } else { super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context) } }


Puede voltear la imagen de la imagen de origen use esto

UIImage *flippedImage = [UIImage imageWithCGImage:picture.CGImage scale:picture.scale orientation:UIImageOrientationLeftMirrored];

Editar: código rápido añadido

let flippedImage = UIImage(CGImage: picture.CGImage, scale: picture.scale, orientation:.LeftMirrored)


Sé que esta pregunta es muy antigua, pero parece que este sigue siendo un problema común. Simplemente configure CGAffineTransform en la propiedad cameraViewTransform en un objeto UIImagePickerController .

let picker = UIImagePickerController() picker.cameraViewTransform = CGAffineTransformScale(picker.cameraViewTransform, -1, 1)


Solo para agregar cómo acabo de lograr esto sin subclasificar UIImagePickerController y sin agregar botones adicionales a la vista de la cámara.

Simplemente escuche esta notificación que se activa varias veces cada vez que se cambia la cámara:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(cameraChanged:) name:@"AVCaptureDeviceDidStartRunningNotification" object:nil];

Luego use este método para voltear la vista de la cámara:

- (void)cameraChanged:(NSNotification *)notification { if(imagePicker.cameraDevice == UIImagePickerControllerCameraDeviceFront) { imagePicker.cameraViewTransform = CGAffineTransformIdentity; imagePicker.cameraViewTransform = CGAffineTransformScale(imagePicker.cameraViewTransform, -1, 1); } else { imagePicker.cameraViewTransform = CGAffineTransformIdentity; } }


Tuve el mismo problema, y ​​la solución anterior solo me dio la mitad de la respuesta, porque el usuario tenía que aprobar la imagen reflejada antes de pasar a la siguiente página de mi aplicación, donde uso la imagen capturada después de moverla.

Para resolver esto, tuve que voltear la vista de la cámara cada vez que cambio a la cámara frontal:

- (IBAction)flipCamera:(id)sender { if(cameraUI.cameraDevice == UIImagePickerControllerCameraDeviceFront) { cameraUI.cameraDevice = UIImagePickerControllerCameraDeviceRear; } else { cameraUI.cameraDevice = UIImagePickerControllerCameraDeviceFront; } cameraUI.cameraViewTransform = CGAffineTransformScale(cameraUI.cameraViewTransform, -1, 1); }

Solo para ampliar esta gran respuesta, un código completo típico, Dec2013, iOS7 / Xcode5. Hace todo Solo necesita un ícono (cameraToggle.PNG en el ejemplo).

-(void)showTheDeviceCamera { if ( ! [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera] ) return; // self.cameraController is a UIImagePickerController self.cameraController = [[UIImagePickerController alloc] init]; self.cameraController.delegate = (id)self; self.cameraController.mediaTypes = @[(NSString *)kUTTypeImage]; self.cameraController.allowsEditing = YES; self.cameraController.sourceType = UIImagePickerControllerSourceTypeCamera; [self presentViewController:self.cameraController animated:YES completion:NULL]; // Add front-rear toggle button MANUALLY, IF NECESSARY // (You seem to usually get it for free, on iPhone, but // need to add manually on an iPad.) UIView *buttonView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"cameraToggle"]]; [buttonView sizeToFit]; buttonView.userInteractionEnabled = YES; [self.cameraController.view addSubview:buttonView]; UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(_frontRearButtonClicked) ]; tap.numberOfTapsRequired = 1; [buttonView addGestureRecognizer:tap]; // we''ll add it at the top right .. could be anywhere you want buttonView.center = CGPointMake( self.cameraController.view.frame.size.width-buttonView.frame.size.width, 3.0 * buttonView.frame.size.height ); } -(void)_frontRearButtonClicked { [UIView transitionWithView:self.cameraController.view duration:1.0 options:UIViewAnimationOptionAllowAnimatedContent | UIViewAnimationOptionTransitionFlipFromLeft animations:^{ if ( self.cameraController.cameraDevice == UIImagePickerControllerCameraDeviceRear ) self.cameraController.cameraDevice = UIImagePickerControllerCameraDeviceFront; else self.cameraController.cameraDevice = UIImagePickerControllerCameraDeviceRear; } completion:NULL]; }