Я пишу свое первое приложение для iOS (только для iPhone) на Swift. Главное окно приложения должно позволять пользователю выбирать изображение из фотогалереи.
Я нашел следующий пример кода ViewController.swift :
class ViewController: UIImagePickerController, UINavigationControllerDelegate, UIImagePickerControllerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) {
var imagePickerController = UIImagePickerController()
imagePickerController.delegate = self
imagePickerController.sourceType = UIImagePickerControllerSourceType.SavedPhotosAlbum
imagePickerController.allowsEditing = true
self.presentViewController(imagePickerController, animated: true, completion: { imageP in
})
}
func imagePickerController(picker: UIImagePickerController!, didFinishPickingImage image: UIImage!, editingInfo: NSDictionary!) {
let selectedImage : UIImage = image
println(selectedImage)
}
}
и иметь следующую сцену контроллера просмотра -
View Controller
- Top Layout Guide
- Bottom Layout Guide
- View
- Image View
First Responder
Exit
Но когда я запускаю приложение, отображается только черный экран. Что я делаю не так? Еще один пример кода, который я нашел, находится на Objective-C, который мне не помогает.
Ответы:
Если вы просто хотите, чтобы пользователь мог выбирать изображение с помощью UIImagePickerController, используйте этот код:
import UIKit class ViewController: UIViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate { @IBOutlet var imageView: UIImageView! @IBOutlet var chooseBuuton: UIButton! var imagePicker = UIImagePickerController() @IBAction func btnClicked() { if UIImagePickerController.isSourceTypeAvailable(.savedPhotosAlbum){ print("Button capture") imagePicker.delegate = self imagePicker.sourceType = .savedPhotosAlbum imagePicker.allowsEditing = false present(imagePicker, animated: true, completion: nil) } } func imagePickerController(picker: UIImagePickerController!, didFinishPickingImage image: UIImage!, editingInfo: NSDictionary!){ self.dismiss(animated: true, completion: { () -> Void in }) imageView.image = image } }
источник
Attempt to present <UIImagePickerController: 0x7fdb84029800> on <MyApp.ViewController: 0x7fdb838360a0> whose view is not in the window hierarchy!
. Стоит ли добавить что-нибудь в сцену?Полное копирование и вставка средства выбора рабочего изображения для Swift 4 на основе ответа @ user3182143:
import Foundation import UIKit class ImagePickerManager: NSObject, UIImagePickerControllerDelegate, UINavigationControllerDelegate { var picker = UIImagePickerController(); var alert = UIAlertController(title: "Choose Image", message: nil, preferredStyle: .actionSheet) var viewController: UIViewController? var pickImageCallback : ((UIImage) -> ())?; override init(){ super.init() let cameraAction = UIAlertAction(title: "Camera", style: .default){ UIAlertAction in self.openCamera() } let galleryAction = UIAlertAction(title: "Gallery", style: .default){ UIAlertAction in self.openGallery() } let cancelAction = UIAlertAction(title: "Cancel", style: .cancel){ UIAlertAction in } // Add the actions picker.delegate = self alert.addAction(cameraAction) alert.addAction(galleryAction) alert.addAction(cancelAction) } func pickImage(_ viewController: UIViewController, _ callback: @escaping ((UIImage) -> ())) { pickImageCallback = callback; self.viewController = viewController; alert.popoverPresentationController?.sourceView = self.viewController!.view viewController.present(alert, animated: true, completion: nil) } func openCamera(){ alert.dismiss(animated: true, completion: nil) if(UIImagePickerController .isSourceTypeAvailable(.camera)){ picker.sourceType = .camera self.viewController!.present(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 openGallery(){ alert.dismiss(animated: true, completion: nil) picker.sourceType = .photoLibrary self.viewController!.present(picker, animated: true, completion: nil) } func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { picker.dismiss(animated: true, completion: nil) } //for swift below 4.2 //func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { // picker.dismiss(animated: true, completion: nil) // let image = info[UIImagePickerControllerOriginalImage] as! UIImage // pickImageCallback?(image) //} // For Swift 4.2+ func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { picker.dismiss(animated: true, completion: nil) guard let image = info[.originalImage] as? UIImage else { fatalError("Expected a dictionary containing an image, but was provided the following: \(info)") } pickImageCallback?(image) } @objc func imagePickerController(_ picker: UIImagePickerController, pickedImage: UIImage?) { } }
Вызовите его из вашего viewcontroller следующим образом:
ImagePickerManager().pickImage(self){ image in //here is the image }
Также не забудьте включить следующие ключи в свой
info.plist
:<key>NSCameraUsageDescription</key> <string>This app requires access to the camera.</string> <key>NSPhotoLibraryUsageDescription</key> <string>This app requires access to the photo library.</string>
источник
imagePickerController
на это, чтобы заставить его работать. Благодарность!func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { let image = info[UIImagePickerController.InfoKey.originalImage] as! UIImage pickImageCallback?(image) picker.dismiss(animated: true, completion: nil) }
Для Swift 3:
Во-первых, вам нужно добавить в info.plist следующий ключ:
<key>NSPhotoLibraryUsageDescription</key> <string>This app requires access to the photo library.</string>
Ваш контроллер View должен соответствовать следующим протоколам:
UIImagePickerControllerDelegate
,UINavigationControllerDelegate
:class ImagePickerViewController: UIViewController,UIImagePickerControllerDelegate, UINavigationControllerDelegate {}
Вам необходимо объявить UIImage, который вы будете использовать для привязки возвращенного / выбранного изображения:
@IBOutlet weak var myImageView: UIImageView! @IBoutlet weak var upLoadImageBtn:UIImage! let imagePicker = UIImagePickerController()
Установите делегат pickerImage в качестве ViewController:
imagePicker.delegate = self
Для кнопки загрузки вам потребуется ссылка на следующее изображение, чтобы запустить действие и отобразить средство выбора изображения:
@IBAction func upLoadImageBtnPressed(_ sender: AnyObject) { imagePicker.allowsEditing = false imagePicker.sourceType = .photoLibrary /* The sourceType property wants a value of the enum named UIImagePickerControllerSourceType, which gives 3 options: UIImagePickerControllerSourceType.PhotoLibrary UIImagePickerControllerSourceType.Camera UIImagePickerControllerSourceType.SavedPhotosAlbum */ present(imagePicker, animated: true, completion: nil) }
Ваш контроллер представления должен реализовать методы делегата для делегатов средства выбора изображения:
// MARK: - ImagePicker Delegate func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage { myImageView.contentMode = .scaleAspectFit myImageView.image = pickedImage } /* Swift Dictionary named “info”. We have to unpack it from there with a key asking for what media information we want. We just want the image, so that is what we ask for. For reference, the available options are: UIImagePickerControllerMediaType UIImagePickerControllerOriginalImage UIImagePickerControllerEditedImage UIImagePickerControllerCropRect UIImagePickerControllerMediaURL UIImagePickerControllerReferenceURL UIImagePickerControllerMediaMetadata */ dismiss(animated: true, completion: nil) } func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { dismiss(animated: true, completion:nil) }
источник
Я дам вам наиболее понятную кодировку для выбора изображения, обратитесь к этому
func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) { var alert:UIAlertController=UIAlertController(title: "Choose Image", message: nil, preferredStyle: UIAlertControllerStyle.ActionSheet) var cameraAction = UIAlertAction(title: "Camera", style: UIAlertActionStyle.Default) { UIAlertAction in self.openCamera() } var gallaryAction = UIAlertAction(title: "Gallary", style: UIAlertActionStyle.Default) { UIAlertAction in self.openGallary() } var cancelAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel) { UIAlertAction in } // Add the actions picker?.delegate = self alert.addAction(cameraAction) alert.addAction(gallaryAction) alert.addAction(cancelAction) self.presentViewController(alert, animated: true, completion: nil) } func openCamera() { 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.") }
Хорошего дня:-)
источник
@IBAction func chooseProfilePicBtnClicked(sender: AnyObject) { let alert:UIAlertController=UIAlertController(title: "Choose Image", message: nil, preferredStyle: UIAlertControllerStyle.ActionSheet) let cameraAction = UIAlertAction(title: "Camera", style: UIAlertActionStyle.Default) { UIAlertAction in self.openCamera() } let gallaryAction = UIAlertAction(title: "Gallary", style: UIAlertActionStyle.Default) { UIAlertAction in self.openGallary() } let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel) { UIAlertAction in } // Add the actions picker.delegate = self alert.addAction(cameraAction) alert.addAction(gallaryAction) alert.addAction(cancelAction) self.presentViewController(alert, animated: true, completion: nil) } func openCamera(){ if(UIImagePickerController .isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera)){ picker.sourceType = UIImagePickerControllerSourceType.Camera self .presentViewController(picker, animated: true, completion: nil) }else{ let alert = UIAlertView() alert.title = "Warning" alert.message = "You don't have camera" alert.addButtonWithTitle("OK") alert.show() } } func openGallary(){ picker.sourceType = UIImagePickerControllerSourceType.PhotoLibrary self.presentViewController(picker, animated: true, completion: nil) } //MARK:UIImagePickerControllerDelegate func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]){ picker .dismissViewControllerAnimated(true, completion: nil) imageViewRef.image=info[UIImagePickerControllerOriginalImage] as? UIImage } func imagePickerControllerDidCancel(picker: UIImagePickerController){ print("picker cancel.") }
источник
В Swift 5 вы должны это сделать
class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { @IBOutlet var imageView: UIImageView! var imagePicker = UIImagePickerController() override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. } @IBAction func setPicture(_ sender: Any) { if UIImagePickerController.isSourceTypeAvailable(.photoLibrary){ imagePicker.delegate = self imagePicker.sourceType = .photoLibrary imagePicker.allowsEditing = false present(imagePicker, animated: true, completion: nil) } } func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { picker.dismiss(animated: true, completion: nil) if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage { imageView.image = image } } }
источник
XCODE 10.1 / SWIFT 4.2:
Добавить необходимые разрешения (другие упоминаются)
Добавьте этот класс в свое представление:
import UIKit import Photos import Foundation class UploadImageViewController: UIViewController, UIImagePickerControllerDelegate , UINavigationControllerDelegate { @IBOutlet weak var imgView: UIImageView! let imagePicker = UIImagePickerController() override func viewDidLoad() { super.viewDidLoad() checkPermission() imagePicker.delegate = self imagePicker.allowsEditing = false imagePicker.sourceType = .photoLibrary } @IBAction func btnSetProfileImageClickedCamera(_ sender: UIButton) { } @IBAction func btnSetProfileImageClickedFromGallery(_ sender: UIButton) { self.selectPhotoFromGallery() } func selectPhotoFromGallery() { self.present(imagePicker, animated: true, completion: nil) } func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { if let pickedImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage { self.imgView.contentMode = .scaleAspectFit self.imgView.image = pickedImage } dismiss(animated: true, completion: nil) } func imagePickerControllerDidCancel(_ picker: UIImagePickerController){ print("cancel is clicked") } func checkPermission() { let photoAuthorizationStatus = PHPhotoLibrary.authorizationStatus() switch photoAuthorizationStatus { case .authorized: print("Access is granted by user") case .notDetermined: PHPhotoLibrary.requestAuthorization({ (newStatus) in print("status is \(newStatus)") if newStatus == PHAuthorizationStatus.authorized { /* do stuff here */ print("success") } }) print("It is not determined until now") case .restricted: // same same print("User do not have access to photo album.") case .denied: // same same print("User has denied the permission.") } } }
источник
Сделайте это для быстрого кодирования изображений из библиотеки фотографий:
var pkcrviewUI = UIImagePickerController() if UIImagePickerController .isSourceTypeAvailable(UIImagePickerControllerSourceType.PhotoLibrary) { pkcrviewUI.sourceType = UIImagePickerControllerSourceType.PhotoLibrary pkcrviewUI.allowsEditing = true pkcrviewUI.delegate = self [self .presentViewController(pkcrviewUI, animated: true , completion: nil)] }
источник
Я знаю, что этому вопросу уже год, но вот довольно простой код (в основном из этого руководства ), который мне подходит:
import UIKit class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { @IBOutlet weak var imageView: UIImageView! var imagePicker = UIImagePickerController() override func viewDidLoad() { super.viewDidLoad() self.imagePicker.delegate = self } @IBAction func loadImageButtonTapped(sender: AnyObject) { print("hey!") self.imagePicker.allowsEditing = false self.imagePicker.sourceType = .SavedPhotosAlbum self.presentViewController(imagePicker, animated: true, completion: nil) } func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) { if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage { self.imageView.contentMode = .ScaleAspectFit self.imageView.image = pickedImage } dismissViewControllerAnimated(true, completion: nil) } func imagePickerControllerDidCancel(picker: UIImagePickerController) { self.imagePicker = UIImagePickerController() dismissViewControllerAnimated(true, completion: nil) }
источник
Для Swift 4
Этот код работает у меня !!
import UIKit class ViewController: UIViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate { @IBOutlet var imageView: UIImageView! @IBOutlet var chooseBuuton: UIButton! var imagePicker = UIImagePickerController() override func viewDidLoad() { super.viewDidLoad() imagePicker.delegate = self } @IBAction func btnClicked() { if UIImagePickerController.isSourceTypeAvailable(.savedPhotosAlbum) { print("Button capture") imagePicker.sourceType = .savedPhotosAlbum; imagePicker.allowsEditing = false self.present(imagePicker, animated: true, completion: nil) } } @objc func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { let chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage imageView.image = chosenImage dismiss(animated: true, completion: nil) } }
источник
Конечно, приведенные выше ответы решают основную проблему.
У меня произошел сбой в Swift 3.0 при запуске фотоальбома, потому что в Info.plist не было этих флагов:
Конфиденциальность - Описание использования библиотеки фотографий -> NSPhotoLibraryUsageDescription
Конфиденциальность - Описание использования камеры -> NSCameraUsageDescription
[
Пожалуйста, добавьте их, если вы столкнетесь с подобной проблемой.
Благодарность !
источник
вот простой способ сделать это:
но сначала вам нужно добавить (Privacy - Photo Library Usage Description) в info.plist, и у вас должна быть кнопка и UIImageView в вашем viewController.
затем создайте выход UIImageView (в этом коде выход называется myImage) и действие кнопки (я вызвал импорт действия в моем коде)
import UIKit class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { override func viewDidLoad() { super.viewDidLoad() } @IBOutlet weak var myImage: UIImageView! @IBAction func importing(_ sender: Any) { let Picker = UIImagePickerController() Picker.delegate = self Picker.sourceType = .photoLibrary self.present(Picker, animated: true, completion: nil) Picker.allowsEditing = true Picker.mediaTypes = UIImagePickerController.availableMediaTypes(for: .photoLibrary)! } func imagePickerController(_ picker: UIImagePickerController,didFinishPickingMediaWithInfo info: [String : Any]) { let chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage //1 myImage.contentMode = .scaleAspectFit //2 myImage.image = chosenImage //3 dismiss(animated:true, completion: nil) //4 } }
источник
Если вы не хотите иметь отдельную кнопку, вот другой способ. Прикрепил жест к самому imageView, где при нажатии на изображение всплывает предупреждение с двумя вариантами. У вас будет возможность выбрать либо из галереи / фото библиотеки, либо отменить оповещение.
import UIKit import CoreData class AddDetailsViewController: UIViewController, UITextFieldDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate { @IBOutlet weak var imageView: UIImageView! var picker:UIImagePickerController? = UIImagePickerController() @IBAction func saveButton(sender: AnyObject) { let managedContext = (UIApplication.sharedApplication().delegate as? AppDelegate)!.managedObjectContext let entity = NSEntityDescription.entityForName("Person", inManagedObjectContext: managedContext) let person = Person(entity: entity!, insertIntoManagedObjectContext: managedContext) person.image = UIImageJPEGRepresentation(imageView.image!, 1.0) //imageView.image do { try person.managedObjectContext?.save() //people.append(person) } catch let error as NSError { print("Could not save \(error)") } } override func viewDidLoad() { super.viewDidLoad() let tapGesture = UITapGestureRecognizer(target: self, action: #selector(AddDetailsViewController.tapGesture(_:))) imageView.addGestureRecognizer(tapGesture) imageView.userInteractionEnabled = true picker?.delegate = self // Do any additional setup after loading the view. } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func tapGesture(gesture: UIGestureRecognizer) { let alert:UIAlertController = UIAlertController(title: "Profile Picture Options", message: nil, preferredStyle: UIAlertControllerStyle.ActionSheet) let gallaryAction = UIAlertAction(title: "Open Gallary", style: UIAlertActionStyle.Default) { UIAlertAction in self.openGallary() } let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel) { UIAlertAction in self.cancel() } alert.addAction(gallaryAction) alert.addAction(cancelAction) self.presentViewController(alert, animated: true, completion: nil) } func openGallary() { picker!.allowsEditing = false picker!.sourceType = UIImagePickerControllerSourceType.PhotoLibrary presentViewController(picker!, animated: true, completion: nil) } func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage { imageView.contentMode = .ScaleAspectFit imageView.image = pickedImage } dismissViewControllerAnimated(true, completion: nil) } func cancel(){ print("Cancel Clicked") } }
Добавив еще к вопросу, реализована логика для хранения изображений в CoreData.
источник
нажмите кнопку, откройте галерею изображений и установите изображение в Imageview Swift 3.0
добавить три делегата UIImagePickerControllerDelegate, UIPopoverControllerDelegate, UINavigationControllerDelegate
var picker:UIImagePickerController?=UIImagePickerController() @IBOutlet var imgPhoto: UIImageView! override func viewDidLoad() { super.viewDidLoad() picker?.delegate=self } @IBAction func btnAddPhotoClicked(_ sender: UIButton) { openGallary() } func openGallary() { picker!.allowsEditing = false picker!.sourceType = UIImagePickerControllerSourceType.photoLibrary present(picker!, animated: true, completion: nil) } //MARK:- ImagePicker Controller Delegate //MARK:- func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { dismiss(animated: true, completion: nil) } func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { if let chosenImage = info[UIImagePickerControllerOriginalImage] as? UIImage { imgPhoto.contentMode = .scaleToFill imgPhoto.image = chosenImage } else{ print("Something went wrong") } self.dismiss(animated: true, completion: nil) }
источник
Просто отвечу здесь, чтобы упомянуть:
info[UIImagePickerControllerEditedImage]
вероятно, вы захотите использовать в большинстве случаев.Помимо этого, ответы здесь исчерпывающие.
источник
Попробуйте это легко .. Создайте изображение с помощью UIImagePickerControllerDelegate
@objc func masterAction(_ sender: UIButton) { if UIImagePickerController.isSourceTypeAvailable(.savedPhotosAlbum){ print("Button capture") imagePicker.delegate = self imagePicker.sourceType = .savedPhotosAlbum; imagePicker.allowsEditing = false self.present(imagePicker, animated: true, completion: nil) } print("hello i'm touch \(sender.tag)") } func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { dismiss(animated: true, completion: nil) } func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { if let chosenImage = info[UIImagePickerControllerOriginalImage] as? UIImage { print("Get Image \(chosenImage)") ImageList.insert(chosenImage, at: 0) ArrayList.insert("", at: 0) Collection_Vw.reloadData() } else{ print("Something went wrong") } self.dismiss(animated: true, completion: nil) }
источник
Если вы хотите выбрать только обычное изображение, вы можете использовать приведенный ниже код, который проверяет, что выбранное изображение не является панорамным.
let picker = UIImagePickerController() func photoFromLibrary() { self.picker.allowsEditing = true self.picker.sourceType = .photoLibrary //picker.mediaTypes = UIImagePickerController.availableMediaTypes(for: .photoLibrary)! self.present(self.picker, animated: true, completion: nil) } func shootPhoto() { if UIImagePickerController.isSourceTypeAvailable(.camera) { self.picker.allowsEditing = true self.picker.sourceType = UIImagePickerControllerSourceType.camera self.picker.cameraCaptureMode = .photo self.picker.modalPresentationStyle = .fullScreen self.present(self.picker,animated: true,completion: nil) } } //Image picker delegate func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { let str = "\(info["UIImagePickerControllerOriginalImage"]!)" let s = str.slice(from: "{", to: "}") if let arr = s?.components(separatedBy: ","){ if arr.count >= 2 { if Int(arr[0])! > 11000 { picker.dismiss(animated:true, completion: nil) self.makeToast("Invalid Image!!!") return } } } } if let image = info[UIImagePickerControllerOriginalImage] as? UIImage{ self.UserImageView.image = image } picker.dismiss(animated:true, completion: nil) } func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { picker.dismiss(animated: true, completion: nil) }
источник
Xcode 10, Swift 4.2
Ниже представлена немного оптимизированная версия реализации. Это в Swift 4.2, и я тоже это тестировал.
Вы можете увидеть полный код ViewController здесь. Обратите внимание, что вы также должны определить IBOutlet (imageView) и IBAction (didTapOnChooseImageButton), определенные и подключенные в раскадровке. Надеюсь это поможет.
import UIKit class ImagePickViewController: UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate { var imagePicker = UIImagePickerController() @IBOutlet weak var imageView: UIImageView! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. } @IBAction func didTapOnChooseImageButton(_ sender: Any) { let alert:UIAlertController=UIAlertController(title: "Choose Image", message: nil, preferredStyle: UIAlertController.Style.actionSheet) let cameraAction = UIAlertAction(title: "Camera", style: UIAlertAction.Style.default) { UIAlertAction in self.openCamera(UIImagePickerController.SourceType.camera) } let gallaryAction = UIAlertAction(title: "Gallary", style: UIAlertAction.Style.default) { UIAlertAction in self.openCamera(UIImagePickerController.SourceType.photoLibrary) } let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertAction.Style.cancel) { UIAlertAction in } // Add the actions imagePicker.delegate = self as UIImagePickerControllerDelegate & UINavigationControllerDelegate alert.addAction(cameraAction) alert.addAction(gallaryAction) alert.addAction(cancelAction) self.present(alert, animated: true, completion: nil) } func openCamera(_ sourceType: UIImagePickerController.SourceType) { imagePicker.sourceType = sourceType self.present(imagePicker, animated: true, completion: nil) } //MARK:UIImagePickerControllerDelegate func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { imageView.image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage imagePicker.dismiss(animated: true, completion: nil) } func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { print("imagePickerController cancel") } }
источник
Вы можете сделать как здесь
var avatarImageView = UIImageView() var imagePicker = UIImagePickerController() func takePhotoFromGallery() { imagePicker.delegate = self imagePicker.sourceType = .savedPhotosAlbum imagePicker.allowsEditing = true present(imagePicker, animated: true) } func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { if let pickedImage = info[.originalImage] as? UIImage { avatarImageView.contentMode = .scaleAspectFill avatarImageView.image = pickedImage } self.dismiss(animated: true) }
Надеюсь, это было полезно
источник
Для Swift 3.4.1 этот код работает:
implements class AddAdvertisementViewController : UINavigationControllerDelegate, UIImagePickerControllerDelegate, UIActionSheetDelegate var imagePicker = UIImagePickerController() var file :UIImage! //action sheet tap on image func tapOnButton(){ let optionMenu = UIAlertController(title: nil, message: "Add Photo", preferredStyle: .actionSheet) let galleryAction = UIAlertAction(title: "Gallery", style: .default, handler:{ (alert: UIAlertAction!) -> Void in self.addImageOnTapped() }) let cameraAction = UIAlertAction(title: "Camera", style: .default, handler:{ (alert: UIAlertAction!) -> Void in self.openCameraButton() }) let cancleAction = UIAlertAction(title: "Cancel", style: .cancel, handler:{ (alert: UIAlertAction!) -> Void in print("Cancel") }) optionMenu.addAction(galleryAction) optionMenu.addAction(cameraAction) optionMenu.addAction(cancleAction) self.present(optionMenu, animated: true, completion: nil) } func openCameraButton(){ if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.camera) { imagePicker = UIImagePickerController() imagePicker.delegate = self imagePicker.sourceType = UIImagePickerControllerSourceType.camera; imagePicker.allowsEditing = true self.present(imagePicker, animated: true, completion: nil) } } func addImageOnTapped(){ if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.photoLibrary){ imagePicker.delegate = self imagePicker.sourceType = UIImagePickerControllerSourceType.photoLibrary; imagePicker.allowsEditing = true self.present(imagePicker, animated: true, completion: nil) } } //picker pick image and store value imageview func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]){ if let image = info[UIImagePickerControllerOriginalImage] as? UIImage { file = image imgViewOne.image = image imagePicker.dismiss(animated: true, completion: nil); } }
источник
@IBAction func ImportImage(_ sender: Any) { let image = UIImagePickerController() image.delegate = self image.sourceType = UIImagePickerController.SourceType.photoLibrary image.allowsEditing = false self.present(image, animated: true) { //After it is complete } } func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage { myimage.image = image } else{ // } self.dismiss(animated: true, completion: nil) do { try context.save() } catch { print("Could not save. \(error), \(error.localizedDescription)") } }
Добавьте
UINavigationControllerDelegate
,UIImagePickerControllerDelegate
делегаты в определение классаисточник