Tout en choisissant une image dans le sélecteur d’images sous iOS 10 Swift 3, je reçois une erreur - Creating an image format with an unknown type is an error
func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) {
imagePost.image = image
self.dismiss(animated: true, completion: nil)
}
L'image n'est pas sélectionnée ni mise à jour. J'ai besoin d'aide ou de suggestion pour savoir si la syntaxe ou quoi que ce soit concernant cette méthode a été modifié dans iOS10 ou Swift 3 ou s'il existe un autre moyen de le faire.
Le code ci-dessous a résolu le problème pour moi -
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
imagePost.image = image
} else{
print("Something went wrong")
}
self.dismiss(animated: true, completion: nil)
}
N'oubliez pas d'ajouter délégué à soi-même
let picker = UIImagePickerController()
picker.delegate = self // delegate added
Le code ci-dessous a résolu le problème:
Si l'utilisateur apporte des modifications à l'image sélectionnée, n'extrayez que cette image, sinon extrayez la source de l'image d'origine sans aucune modification et fermez enfin le contrôleur de vue du sélecteur d'images.
public func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]){
if let image = info[UIImagePickerControllerEditedImage] as? UIImage {
imageView.image = image
}
else if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
imageView.image = image
} else{
print("Something went wrong")
}
self.dismiss(animated: true, completion: nil)
}
Si vous autorisez l'édition de l'image imageController.allowsEditing = true
, vous devez d'abord obtenir l'image modifiée:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
picker.dismissViewControllerAnimated(true, completion: nil)
if let image = info[UIImagePickerControllerEditedImage] as? UIImage {
imagePost.image = image
} else if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
imagePost.image = image
} else {
imagePost.image = nil
}
}
J'ai trouvé que les images par défaut de la photothèque pouvaient être à l'origine de ce problème ... Si vous faites glisser une image de votre ordinateur sur le simulateur et que vous la choisissez .. ce problème est résolu
La solution acceptée par Jeetendra Choudhary fonctionne. Bien que dans Xcode 8 avec Swift 3, j'ai remarqué qu'elle génère un avertissement: Instance method 'imagePickerController(_:didFinishPickingMediaWithInfo:)' nearly matches optional requirement 'imagePickerController(_:didFinishPickingMediaWithInfo:)' of protocol 'UIImagePickerControllerDelegate'
et suggère d'ajouter le mot clé @nonobjc ou private pour faire taire l'avertissement.Si vous faites taire l'avertissement à l'aide de ces suggestions, la solution ne fonctionne plus.
Selon la réponse d'Abdurohman, je change de code et je résous le problème, merci.
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
let selectedImage = info[UIImagePickerControllerOriginalImage] as! UIImage
photoImageView.image = selectedImage
// Dismiss the picker.
dismiss(animated: true, completion: nil)
}
Ajoutez ceci à viewDidload ()
imagepicker.delegate = self
Cela a fonctionné pour moi:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
imageView.image = image
self.dismiss(animated: true, completion: nil)
}
}
Changez didFinishPickingMediaWithInfo info: [String : AnyObject]
, à didFinishPickingMediaWithInfo info: [String : Any]
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
imgViewPhoto.image = image
} else{
print("Something went wrong")
}
picker.dismiss(animated: true, completion: nil)
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
let image = info[UIImagePickerControllerOriginalImage] as? UIImage
self.dismiss(animated: true, completion: nil)
self.imageTook.image = image
}
Pour Xcode 8.1 avec Swift 3, après avoir modifié la méthode de délégation comme indiqué ci-dessous
change ton
func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) {
imagePost.image = image
self.dismiss(animated: true, completion: nil)
}
fonction à
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])
{
imagePost.image = info[UIImagePickerControllerOriginalImage] as? UIImage
picker.dismiss(animated: true, completion: nil)
}
J'ai oublié d'ajouter UINavigationControllerDelegate avec UIImagePickerControllerDelegate dans
class ViewController:UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate
Vous auriez ajouté une variable au début comme
var imagePicker = UIImagePickerController ()
et paramétrer délégué et appeler une fonction dans viewdidload () en tant que
imagePicker.delegate = self
viwImagePick()
Puis expliquer cette fonction en tant que
//ImagePicker
func viwImagePick(){
let alert = UIAlertController(title: nil, message: "Choose your source", preferredStyle: UIAlertControllerStyle.alert)
alert.addAction(UIAlertAction(title: "Camera", style: UIAlertActionStyle.default) { (result : UIAlertAction) -> Void in
print("Camera selected")
self.openCamera()
//Code for Camera
//cameraf
})
alert.addAction(UIAlertAction(title: "Photo library", style: UIAlertActionStyle.default) { (result : UIAlertAction) -> Void in
print("Photo selected")
self.openGallary()
//Code for Photo library
//photolibaryss
})
self.present(alert, animated: true, completion: nil)
}
func openCamera()
{
imagePicker.sourceType = UIImagePickerControllerSourceType.camera
if UIDevice.current.userInterfaceIdiom == .phone
{
self.present(imagePicker, animated: true, completion: nil)
}
else
{
let popover = UIPopoverController(contentViewController: imagePicker)
popover.present(from: profileImgViw.frame, in: self.view, permittedArrowDirections: UIPopoverArrowDirection.any, animated: true)
}
}
func openGallary()
{
imagePicker.sourceType = UIImagePickerControllerSourceType.savedPhotosAlbum
if UIDevice.current.userInterfaceIdiom == .phone
{
self.present(imagePicker, animated: true, completion: nil)
}
else
{
let popover = UIPopoverController(contentViewController: imagePicker)
popover.present(from: profileImgViw.frame, in: self.view, permittedArrowDirections: UIPopoverArrowDirection.any, animated: true)
}
}
Maintenant, l'image est ajoutée à la vue de l'image à partir de la bibliothèque
Ajouter "_" dans les paramètres de la fonction.
de
func imagePickerController(picker: UIImagePickerController ...
à
func imagePickerController(_ picker: UIImagePickerController ...
Si cela peut aider quelqu'un, c'est ce qui s'est passé lorsque j'ai sous-classé UIImageView pour créer une vue arrondie. C'est également arrivé quand j'ai ajouté la ligne ci-dessous dans viewDidLoad ()
imageView.layer.cornerRadius = self.imageView.frame.size.width / 2
J'ai fini par ajouter la ligne dans viewWillLayoutSubViews et cela a fonctionné. Voir ceci pour plus de détails:
clipsToBounds empêche UIImage de s'afficher dans iOS10 et XCode 8
Cela a fonctionné pour moi. Il suffit de copier et coller exactement.
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
// The info dictionary contains multiple representations of the image, and this uses the original.
let selectedImage = info[UIImagePickerControllerOriginalImage] as! UIImage
// Set photoImageView to display the selected image.
photoImageView.image = selectedImage
// Dismiss the picker.
dismiss(animated: true, completion: nil)
}
// sélecteur d'images avec vue de collection class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate, UICollectionViewDataSource, UICollectionViewDelegate {
@IBOutlet var img: UIImageView!
@IBOutlet weak var collview: UICollectionView!
var image = NSMutableArray()
let imgpkr = UIImagePickerController()
override func viewDidLoad() {
super.viewDidLoad()
imgpkr.delegate = self
}
@IBAction func btnselect(_ sender: UIButton) {
imgpkr.allowsEditing = true // false
imgpkr.sourceType = .photoLibrary
imgpkr.mediaTypes = UIImagePickerController.availableMediaTypes(for: .photoLibrary)!
present(imgpkr, animated: true, completion: nil)
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
let choose = info[UIImagePickerControllerOriginalImage]as!UIImage
let edit = info[UIImagePickerControllerEditedImage]as!UIImage
img.contentMode = .scaleAspectFit
img.image = edit
//MARK:- Add image in collview
image.add(edit)
collview.reloadData()
dismiss(animated: true, completion: nil)
}
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
dismiss(animated: true, completion: nil)
}
//MARK:- Collection View
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return image.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collview.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)as! CollectionViewCell1
cell.img1.image = image.object(at: indexPath.item)as! UIImage
return cell
}
Assurez-vous d'inclure également le délégué UINavigationControllerDelegate
. Cela a résolu le problème pour moi.
essayez ci-dessous
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
print("image selected");
let selectedImage = info[UIImagePickerControllerOriginalImage] as! UIImag
self.dismiss(animated: true, completion: nil)
UIImg.image = selectedImage
}
Ce que j'ai fait, c'est qu'une fois l'image de didFinishPickingMediaWithInfo reçue, j'ai appelé:
func prepareImageForSaving(image:UIImage) {
// create NSData from UIImage
guard let imageData = UIImageJPEGRepresentation(image, 1) else {
// handle failed conversion
print("jpg error")
return
}
self.saveImage(imageData: imageData as NSData)
}
func saveImage(imageData: NSData) {
imageDatas = imageData
}
pour l'enregistrer au format NSData.
La console m'a quand même averti sur "[Générique] La création d'un format d'image avec un type inconnu est une erreur" mais au moins, mon imageView est mis à jour pour l'image sélectionnée au lieu d'afficher la précédente de viewDidLoad.