Pregunta UIImagePickerController en iPad con IOS9


Desde iOS 9 y Xcode 7, ya no puedo implementar un UIImagePickerController en un iPad (dispositivo y simulador). El siguiente código funciona en el iPad, pero solo antes de iOS 9. Cuando se usa iOS 9+, la imagen presentada (después de que se descarta el UIImagePickerController) es una versión incorrecta de la imagen seleccionada. Sin cambiar el tamaño o recortar, ¿la imagen final es solo la esquina superior derecha de la imagen 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í hay un ejemplo de una imagen seleccionada presentada en un UIImagePickerController. (observe cómo la imagen seleccionada se presenta muy pequeña y no tiene el tamaño / ancho completo de la pantalla como antes)

enter image description here

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

enter image description here


32
2017-10-23 18:25


origen


Respuestas:


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

Solución actual pésima:

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

Swift 3.0:

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

11
2017-10-14 08:41



Consulte la codificación 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.")
}

4
2017-10-26 13:07



Debes asegurarte de tener el marco correcto para tu vista de imagen y el modo de contenido para tu vista de imagen debe estar ajustado y la imagen devuelta por el selector es de tipo [UIImagePickerControllerOriginalImage]

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

Rápido:

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

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

Es un valor booleano que indica si el usuario puede editar una   imagen fija o película seleccionada.

Si desea seleccionar fotos de la biblioteca de la cámara, debe modificar el tipo de fuente para

    picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;

Actualizar:

Dice que ha seleccionado una imagen y la muestra en la vista de la imagen. Supongo que tiene una vista de la imagen en la vista, y el marco de la vista de la imagen es igual al marco de la vista. Si el IB es de forma libre, supongo que el tamaño 600x600 para el marco de la vista de imagen en el IB.

si simplemente lo haces:

     _startImageView.image=_img;

El resultado será:

enter image description here

Ahora hagamos algunos cambios a la imagen que se mostrará en la vista de imagen:

  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 imagen será:

enter image description here

La imagen original elegida es de tamaño 640x426, cuando no está escalado.

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

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

Entonces, aunque intentes hacer:

      [_img drawInRect:_startImageView.frame];

La imagen no se dibujará según nuestra necesidad, ya que la imagen ya está escalada justo en el momento en que la imagen dada por el selector es la edited image.

Solución:

Para solucionar esto, debe seleccionar la imagen original del selector en didFinishPickingMediaWithInfo: método

       info[UIImagePickerControllerOriginalImage];

que te da la imagen:

enter image description here


3
2017-10-23 18:38



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

Esto funciona perfectamente para mi:

   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 required.

    self.presentViewController(image, animated: true, completion: nil)

}

         func imagePickerController(picker: UIImagePickerController,    didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) {



    self.dismissViewControllerAnimated(true, completion:nil)

}

¿Esto funciona?


2
2017-11-01 13:09



Estoy trabajando en xcode 7.1 (Swift) y encontré tu código apropiado. También escribí el código a continuación 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 ImagePickerController ejemplo. Para su referencia, cargo mi código en: https://www.dropbox.com/s/pe0yikxsab8u848/ImagePicker-Swift.zip?dl=0

Mi idea es solo mirar mi código una vez, puede ser que tengas una idea acerca de qué sección del código funciona mal.


1
2017-10-26 11:35



Parece que está utilizando IB y el diseño automático, pero ha establecido una restricción correcta. Intenta agregar alguna restricción en tu guión gráfico.


1
2017-10-29 12:50



para mí estaba resuelto, 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.preferredContentSize = 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)
}

1
2017-10-27 15:37