web-dev-qa-db-fra.com

UIImagePickerController sur iPad avec IOS9

Depuis iOS 9 et Xcode 7, je ne peux plus implémenter un UIImagePickerController sur un iPad (à la fois appareil et simulateur). Le code ci-dessous fonctionne sur l'iPad mais uniquement avant iOS 9. Lors de l'utilisation d'iOS 9+, l'image présentée (après le rejet de UIImagePickerController) est une version incorrecte de l'image sélectionnée. Sans redimensionnement ni recadrage, l'image finale n'est que le coin supérieur droit de l'image d'origine ?? Plus un autre problème - Si imagePicker.allowsEditing = false, vous ne pouvez pas sélectionner les images de la 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
            })    

}

Voici un exemple d'une image sélectionnée présentée dans un UIImagePickerController. (remarquez comment l'image sélectionnée est présentée très petite et pas pleine taille/largeur d'écran comme auparavant)

enter image description here

Après avoir sélectionné le bouton d'utilisation dans UIImagePickerController, l'image finale n'est que dans le coin supérieur droit de l'image d'origine. Qu'est-ce que je fais de mal ou UIImagePickerController est-il cassé sur iOS 9?

enter image description here

32
pete

Il s'agit d'un bogue d'Apple: http://openradar.appspot.com/radar?id=5032957332946944

Solution de contournement actuelle:

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

Swift 3.0:

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

Reportez-vous au codage ci-dessous

@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
user3182143

Vous devez vous assurer d'avoir le cadre correct pour votre imageview et le contentmode pour votre imageview devrait être aspectfit et l'image retournée par le sélecteur est de type [UIImagePickerControllerOriginalImage]

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

Swift:

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

et venant à la propriété allowsEditing, Il n'est pas lié à la sélection de photos.

Il s'agit d'une valeur booléenne indiquant si l'utilisateur est autorisé à modifier une image fixe ou un film sélectionné.

Si vous souhaitez sélectionner des photos dans la bibliothèque de caméras, vous devez modifier le type de source pour

    picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;

Mise à jour:

LEts disent que vous avez sélectionné une image et l'afficher sur la vue d'image. Je suppose que vous avez une vue d'image sur la vue, et le cadre de vue d'image est égal au cadre de vue. Si l'IB est de forme libre, j'assume la taille 600x600 pour le cadre de visualisation d'image dans l'IB.

si vous faites simplement:

     _startImageView.image=_img;

Le résultat sera:

enter image description here

Maintenant, apportons quelques modifications à l'image à afficher dans la vue d'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;

et maintenant l'image sera:

enter image description here

L'image originale choisie est de taille 640x426, lorsqu'elle n'est pas mise à l'échelle .

L'image d'origine choisie est de taille 1536x1286 lorsqu'elle est mise à l'échelle au maximum (avec une action de zoom à deux doigts) .

Comme vous pouvez le voir, il n'y a toujours pas de changement énorme dans l'image, c'est parce que l'image est déjà recadrée/mise à l'échelle au moment où votre image a reçu l'image !!!

Donc, même si vous essayez de faire:

      [_img drawInRect:_startImageView.frame];

L'image ne sera pas dessinée selon nos besoins, car l'image est déjà redimensionnée au moment où l'image donnée par le sélecteur est le edited image.

Solution:

Pour résoudre ce problème, vous devez sélectionner l'image d'origine dans le sélecteur dans didFinishPickingMediaWithInfo: méthode

       info[UIImagePickerControllerOriginalImage];

ce qui vous donne l'image:

enter image description here

3
Teja Nandamuri

Ce code est relativement similaire à @ pkc456, juste un peu plus court.

Cela fonctionne parfaitement pour moi:

   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)

}

Est-ce que ça marche?

2
Lukesivi

Je travaille sur xcode 7.1 (Swift) et j'ai trouvé votre code approprié. J'ai également écrit le code ci-dessous sur mon projet et cela fonctionne avec succès.

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 seule différence entre votre code et mon code concerne la visibilité de l'instance ImagePickerController. Pour votre référence, je télécharge mon code sur: - https://www.dropbox.com/s/pe0yikxsab8u848/ImagePicker-Swift.zip?dl=

Mon idée est juste de regarder mon code une fois, peut-être que vous aurez une idée de la section de votre code qui fonctionne mal.

1
pkc456

pour moi j'ai été résolu, montrant le mode 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
Carlos Chaguendo

Il semble que vous utilisiez IB et la mise en page automatique, mais que vous ayez défini une bonne contrainte. Essayez d'ajouter une contrainte dans votre storyboard.

1
MatthewLuiHK