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)
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?
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 {
}
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.")
}
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:
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:
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:
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?
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.
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)
}
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.