Beim Auswählen eines Bildes aus der Bildauswahl in iOS 10 Swift 3 wird eine Fehlermeldung angezeigt. 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)
}
Das Bild wird nicht ausgewählt und aktualisiert. Ich brauche Hilfe oder einen Vorschlag, um zu erfahren, ob die Syntax oder etwas in Bezug auf diese Methode in iOS10 oder Swift 3 geändert wurde oder ob es eine andere Möglichkeit gibt, dies zu tun.
Der unten genannte Code hat das Problem für mich gelöst -
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)
}
Denken Sie daran, einen Delegierten zu sich selbst hinzuzufügen
let picker = UIImagePickerController()
picker.delegate = self // delegate added
Der folgende Code hat das Problem gelöst:
Wenn der Benutzer Änderungen an dem ausgewählten Bild vornimmt, wird nur das Bild gezogen. Andernfalls wird die Originalbildquelle ohne Änderungen gezogen und schließlich der Bild-Picker-View-Controller geschlossen.
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)
}
Wenn Sie die Bearbeitung des Bildes imageController.allowsEditing = true
zulassen, müssen Sie zuerst das bearbeitete Bild erhalten:
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
}
}
Ich habe festgestellt, dass die Standardbilder in der Fotobibliothek dieses Problem verursachen könnten .. Wenn Sie ein Bild von Ihrem Computer in den Simulator ziehen und es auswählen, wird dieses Problem behoben
Die akzeptierte Lösung von Jeetendra Choudhary funktioniert. Obwohl ich in Xcode 8 mit Swift 3 festgestellt habe, dass eine Warnung ausgegeben wird: Instance method 'imagePickerController(_:didFinishPickingMediaWithInfo:)' nearly matches optional requirement 'imagePickerController(_:didFinishPickingMediaWithInfo:)' of protocol 'UIImagePickerControllerDelegate'
und schlägt vor, entweder das Schlüsselwort @nonobjc oder private hinzuzufügen, um die Warnung auszuschalten. Wenn Sie die Warnung mit diesen Vorschlägen unterdrücken, funktioniert die Lösung jedoch nicht mehr.
Nach der Antwort von Abdurohman ändere ich meinen Code und löse das Problem danke.
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)
}
Fügen Sie dies zu viewDidload () hinzu.
imagepicker.delegate = self
Das hat für mich funktioniert:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
imageView.image = image
self.dismiss(animated: true, completion: nil)
}
}
didFinishPickingMediaWithInfo info: [String : AnyObject]
, .__ ändern. zu 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
}
Für Xcode 8.1 mit Swift 3, Nach dem Ändern der Delegatmethode wie folgt
ändere dein
func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) {
imagePost.image = image
self.dismiss(animated: true, completion: nil)
}
funktion zu
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])
{
imagePost.image = info[UIImagePickerControllerOriginalImage] as? UIImage
picker.dismiss(animated: true, completion: nil)
}
Ich habe vergessen, UINavigationControllerDelegate zusammen mit UIImagePickerControllerDelegate in hinzuzufügen
class ViewController:UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate
Sie hätten am Anfang eine Variable hinzugefügt
var imagePicker = UIImagePickerController ()
und Delegieren und Aufrufen einer Funktion in viewdidload () als
imagePicker.delegate = self
viwImagePick()
Dann erklären Sie diese Funktion als
//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)
}
}
Nun wird das Bild aus der Bibliothek zur Bildansicht hinzugefügt
Fügen Sie in Funktionsparametern "_" hinzu.
von
func imagePickerController(picker: UIImagePickerController ...
zu
func imagePickerController(_ picker: UIImagePickerController ...
Wenn dies jemandem hilft, hatte ich dies, als ich UIImageView zur Erstellung einer abgerundeten Ansicht subclassierte. Es ist auch passiert, als ich die folgende Zeile in viewDidLoad () hinzugefügt habe.
imageView.layer.cornerRadius = self.imageView.frame.size.width / 2
Am Ende fügte ich die Zeile in viewWillLayoutSubViews hinzu und es funktionierte. Weitere Informationen finden Sie hier:
clipsToBounds bewirkt, dass UIImage in iOS10 und XCode 8 nicht angezeigt wird
Das hat bei mir funktioniert. Kopieren Sie es einfach und fügen Sie es genau ein.
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)
}
// Bildauswahl mit Sammlungsansicht Klasse 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
}
Stellen Sie sicher, dass Sie auch den DelegatenUINavigationControllerDelegate
angeben. Dies löste das Problem für mich.
versuchen Sie es unten
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
}
Was ich tat, war, als ich das Bild von didFinishPickingMediaWithInfo bekam, rief ich an:
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
}
um es im NSData-Format zu speichern.
Die Konsole hat mich immer noch über "[Generic]" gewarnt. Das Erstellen eines Bildformats mit einem unbekannten Typ ist ein Fehler. "Aber zumindest meine imageView wird auf das ausgewählte Bild aktualisiert, anstatt das vorherige von viewDidLoad anzuzeigen.