"Создание формата изображения с неизвестным типом является ошибкой" с помощью UIImagePickerController
при выборе изображения из средства выбора изображений в iOS 10 Swift 3 я получаю сообщение об ошибке -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)
}
изображение не выбирается и не обновляется. Мне нужна помощь или предложение, чтобы узнать, был ли изменен синтаксис или что-либо в отношении этого метода в iOS10 или Swift 3 или есть ли другой способ сделать это.
23 ответа:
ниже упомянутый код действительно решить эту проблему для меня -
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) }
Не забудьте добавить делегат в self
let picker = UIImagePickerController() picker.delegate = self // delegate added
ниже код действительно решить эту проблему:
если пользователь выполняет изменения в выбранном изображении, потяните только это изображение, иначе потяните исходный источник изображения без каких-либо изменений и, наконец, отключите контроллер вида выбора изображений.
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) }
Если вы разрешите редактирование изображения
imageController.allowsEditing = true
тогда вам нужно будет сначала получить отредактированное изображение: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 } }
на принято решение by Чудхари Jeetendra строительство.Хотя в Xcode 8 С Swift 3 я заметил , что он генерирует предупреждение :
Instance method 'imagePickerController(_:didFinishPickingMediaWithInfo:)' nearly matches optional requirement 'imagePickerController(_:didFinishPickingMediaWithInfo:)' of protocol 'UIImagePickerControllerDelegate'
и предлагает добавить @nonobjc или частная ключевое слово, чтобы отключить предупреждение.Если вы отключите предупреждение, используя эти предложения, решение больше не работает.
Я обнаружил, что изображения по умолчанию в библиотеке фотографий могут решить эту проблему. Если вы перетащите изображение с Вашего компьютера на симулятор и выберите его. эта проблема решена
согласно ответа Abdurohman, я изменить мой код и решить проблему,спасибо.
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) }
добавить " _ " в параметры функции.
С
func imagePickerController(picker: UIImagePickerController ...
до
func imagePickerController(_ picker: UIImagePickerController ...
это сработало для меня:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { if let image = info[UIImagePickerControllerOriginalImage] as? UIImage { imageView.image = image self.dismiss(animated: true, completion: nil) } }
Если это кому-то поможет, у меня это произошло, когда я подкласс UIImageView для создания округленного вида. Это также произошло, когда я добавил строку ниже в viewDidLoad ()
imageView.layer.cornerRadius = self.imageView.frame.size.width / 2
Я закончил тем, что добавил строку в viewWillLayoutSubViews, и это сработало. Посмотреть подробнее:
clipsToBounds вызывает объектами UIImage, чтобы не отображать в iOS10 & Xcode версии 8
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { let image = info[UIImagePickerControllerOriginalImage] as? UIImage self.dismiss(animated: true, completion: nil) self.imageTook.image = image }
изменить
didFinishPickingMediaWithInfo info: [String : AnyObject]
, кdidFinishPickingMediaWithInfo info: [String : Any]
для Xcode 8.1 с swift 3, после изменения метода делегата, как показано ниже
изменить
func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) { imagePost.image = image self.dismiss(animated: true, completion: nil) }
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]) { print("image selected"); let selectedImage = info[UIImagePickerControllerOriginalImage] as! UIImag self.dismiss(animated: true, completion: nil) UIImg.image = selectedImage }
это сработало для меня. Просто скопируйте и вставьте его точно.
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) }
что я сделал, так это то, что как только я получил изображение от didFinishPickingMediaWithInfo, я позвонил:
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 }
чтобы сохранить его в формате NSData.
консоль все еще предупреждала меня о том, что "[Generic] создание формата изображения с неизвестным типом является ошибкой", но по крайней мере мой imageView обновляется до выбранного изображения, а не показывает предыдущий из viewDidLoad.
/ / средство выбора изображений с видом коллекции класс 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 }