UIImagePickerController en iPad con iOS9

Desde iOS 9 y Xcode 7 ya no puedo implementar un UIImagePickerController en un iPad (tanto dispositivo como simulador). El código a continuación funciona en el iPad, pero solo antes de iOS 9. Cuando se utiliza iOS 9+, la image presentada (una vez que se descarta el UIImagePickerController) es una versión incorrecta de la image seleccionada. Sin cambiar el tamaño o recortar la image final, ¿solo está la esquina superior derecha de la image original? Además de otro problema: si imagePicker.allowsEditing = false, ¿no puede seleccionar imágenes de PhotoLibrary?

@IBAction func photoButton(sender: AnyObject) { imagePicker.allowsEditing = true imagePicker.sourceType = .PhotoLibrary self.presentViewController(imagePicker, animated: false, completion: nil) } func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { if let pickedImage = info[UIImagePickerControllerEditedImage] as? UIImage { self.imageView.image = pickedImage dismissViewControllerAnimated(true, completion: { () -> Void in }) } 

Aquí está un ejemplo de una image seleccionada presentada en un UIImagePickerController. (observe cómo la image seleccionada se presenta muy pequeña y no tiene el tamaño / ancho completo de la pantalla como antes)

introduzca la descripción de la imagen aquí

Después de seleccionar el button de uso dentro del UIImagePickerController, la image final es solo la parte superior derecha de la image original. ¿Qué estoy haciendo mal o está UIImagePickerController roto en iOS 9?

introduzca la descripción de la imagen aquí

Este es un error de Apple: http://openradar.appspot.com/radar?id=5032957332946944

Poca solución actual:

  if UIDevice.currentDevice().userInterfaceIdiom == .Pad { imagePicker.allowsEditing = false } else { imagePicker.allowsEditing = true } 

Swift 3.0:

 if UIDevice.current.userInterfaceIdiom == .pad { } 

Consulte la encoding a continuación.

 @IBAction func photoButton(sender: AnyObject) { if(UIImagePickerController .isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera)) { picker!.sourceType = UIImagePickerControllerSourceType.Camera self .presentViewController(picker!, animated: true, completion: nil) } else { let alertWarning = UIAlertView(title:"Warning", message: "You don't have camera", delegate:nil, cancelButtonTitle:"OK", otherButtonTitles:"") alertWarning.show() } } func openGallary() { picker!.sourceType = UIImagePickerControllerSourceType.PhotoLibrary self.presentViewController(picker!, animated: true, completion: nil) } //PickerView Delegate Methods func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) { picker .dismissViewControllerAnimated(true, completion: nil) imageView.image=info[UIImagePickerControllerOriginalImage] as? UIImage } func imagePickerControllerDidCancel(picker: UIImagePickerController) { println("picker cancel.") } 

Debe asegurarse de tener el marco correcto para su vista de image y el modo de contenido para su vista de image debe ser aspectfit y la image devuelta por el selector es del tipo [UIImagePickerControllerOriginalImage]

 [imageView setFrame:imageViewRect]; [imageView setContentMode:UIViewContentModeScaleAspectFit]; 

Rápido:

  imageView.setFrame(imageViewRect) imageView.setContentMode(UIViewContentModeScaleAspectFit) 

y viniendo a la propiedad allowsEditing , no está relacionado con la selección de fotos.

Es un valor boolean que indica si el usuario tiene permiso para editar una image fija o película seleccionada.

Si desea seleccionar fotos de la biblioteca de la camera, debe modificar el tipo de fuente para

  picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; 

Actualizar:

Las references indican que ha seleccionado una image y la muestra en la vista de la image. Supongo que tiene una vista de image en la vista y el marco de vista de image es igual al marco de vista. Si el IB es de forma libre, asumo el tamaño 600×600 para el marco de image en el IB.

si simplemente haces:

  _startImageView.image=_img; 

El resultado será:

introduzca la descripción de la imagen aquí

Ahora hagamos algunos cambios en la image que se mostrará en la image:

  CGRect scaledRect = AVMakeRectWithAspectRatioInsideRect(_img.size, CGRectMake(0, 0, self.startImageView.frame.size.width, self.startImageView.frame.size.height)); UIGraphicsBeginImageContext(CGSizeMake(_startImageView.frame.size.width,_startImageView.frame.size.height)); [_img drawInRect:scaledRect]; UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); _startImageView.image=scaledImage; 

y ahora la image será:

introduzca la descripción de la imagen aquí

La image original elegida es de tamaño 640×426, cuando no se escala .

La image original elegida es de tamaño 1536×1286 cuando se escala al máximo (con dos dedos de acción de zoom) .

Como puede ver, todavía no hay un gran cambio en la image, es porque la image ya está recortada / escalada para cuando la image de su image recibió la image !!!

Entonces aunque intentes hacer:

  [_img drawInRect:_startImageView.frame]; 

La image no se dibujará de acuerdo con nuestra necesidad, ya que la image ya está escalada en ese momento, ya que la image que le da el selector es la edited image .

Solución:

Para solucionarlo, debe seleccionar la image original del selector en didFinishPickingMediaWithInfo: method

  info[UIImagePickerControllerOriginalImage]; 

que te da la image:

introduzca la descripción de la imagen aquí

Este código es relativamente similar a @ pkc456, solo un poco más corto.

Esto funciona perfectamente para mí:

  import UIKit class PostImageViewController: UIViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate { @IBOutlet var imageToPost: UIImageView! @IBAction func chooseImage(sender: AnyObject) { var image = UIImagePickerController() image.delegate = self image.sourceType = UIImagePickerControllerSourceType.PhotoLibrary image.allowsEditing = false //or true additional setup requinetworking. self.presentViewController(image, animated: true, completion: nil) } func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) { self.dismissViewControllerAnimated(true, completion:nil) } 

¿Esto funciona?

Estoy trabajando en xcode 7.1 (Swift) y encontré su código apropiado. También escribí el código siguiente en mi proyecto y está funcionando con éxito.

 func showPicker(){ let type = UIImagePickerControllerSourceType.PhotoLibrary if(UIImagePickerController.isSourceTypeAvailable(type)){ let pickerController = UIImagePickerController() pickerController.delegate = self pickerController.sourceType = UIImagePickerControllerSourceType.PhotoLibrary pickerController.allowsEditing = false self.presentViewController(pickerController, animated: true, completion: nil) } } func imagePickerController(picker: UIImagePickerController!, didFinishPickingImage image: UIImage!, editingInfo: NSDictionary!) { let imageView = self.view.viewWithTag(20) as! UIImageView let selectedImage : UIImage = image imageView.image=selectedImage self.dismissViewControllerAnimated(true, completion: nil) } 

La única diferencia en su código y mi código es sobre la visibilidad de la instancia de ImagePickerController . Para su reference, subo mi código en: – https://www.dropbox.com/s/pe0yikxsab8u848/ImagePicker-Swift.zip?dl=0

Mi idea es mirar mi código una vez, puede que tengas una idea de qué sección de tu código funciona incorrectamente.

Parece que está utilizando IB y layout automático pero ha establecido una restricción correcta. Intente agregar alguna restricción en su guión gráfico.

para mí me resolví, mostrando el modo como popover

  @IBAction func photoButton(sender: AnyObject) { imagePicker.allowsEditing = true imagePicker.sourceType = .PhotoLibrary let controller = self.imagePicker controller.modalPresentationStyle = UIModalPresentationStyle.Popover controller.modalTransitionStyle = UIModalTransitionStyle.CoverVertical let popover = controller.popoverPresentationController popover?.sourceView = self controller.prefernetworkingContentSize = CGSize( width: self.frame.width * 0.6, height: self.frame.height * 0.6 ) popover?.sourceRect = CGRectMake( CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds), 0, 0 ) self.presentViewController(self.imagePicker, animated: true, completion: nil) }