Estoy escribiendo mi primera aplicación para iOS (solo iPhone) con Swift. La vista principal de la aplicación debería permitir al usuario elegir la imagen de la galería de fotos.
Encontré el siguiente código de muestra de 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)
}
}
y tener la siguiente escena del controlador de vista:
View Controller
- Top Layout Guide
- Bottom Layout Guide
- View
- Image View
First Responder
Exit
Pero cuando inicio la aplicación, solo se muestra una pantalla negra. ¿Que estoy haciendo mal? Otro código de muestra que encontré está en Objective-C, lo que no me ayuda.
Respuestas:
Si solo desea que el usuario elija la imagen con UIImagePickerController, use este código:
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 } }
fuente
Attempt to present <UIImagePickerController: 0x7fdb84029800> on <MyApp.ViewController: 0x7fdb838360a0> whose view is not in the window hierarchy!
. ¿Debo agregar algo a la escena?Selector de imágenes de trabajo de copiar y pegar completo para swift 4 basado en la respuesta de @ 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() } func pickImage(_ viewController: UIViewController, _ callback: @escaping ((UIImage) -> ())) { pickImageCallback = callback; self.viewController = viewController; 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) 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?) { } }
Llámelo desde su viewcontroller así:
ImagePickerManager().pickImage(self){ image in //here is the image }
Además, no olvide incluir las siguientes claves en su
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>
fuente
imagePickerController
con esto para que funcione. ¡Gracias!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) }
Para Swift 3:
Primero, debe agregar la siguiente clave en info.plist:
<key>NSPhotoLibraryUsageDescription</key> <string>This app requires access to the photo library.</string>
Su controlador View debe cumplir con los siguientes protocolos:
UIImagePickerControllerDelegate
,UINavigationControllerDelegate
:class ImagePickerViewController: UIViewController,UIImagePickerControllerDelegate, UINavigationControllerDelegate {}
Debe declarar el UIImage que utilizará para enlazar la imagen devuelta / seleccionada:
@IBOutlet weak var myImageView: UIImageView! @IBoutlet weak var upLoadImageBtn:UIImage! let imagePicker = UIImagePickerController()
Configure el delegado pickerImage para que sea su ViewController:
imagePicker.delegate = self
Para el botón de carga, deberá vincular a la siguiente imagen para activar la acción y mostrar el selector de imágenes:
@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) }
Su controlador de vista necesita implementar los métodos de delegado para los delegados del selector de imágenes:
// 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) }
fuente
Le daré la mejor codificación comprensible para elegir la imagen, consulte esto
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.") }
Que tengas un buen día:-)
fuente
@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.") }
fuente
En Swift 5 tienes que hacer esto
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 } } }
fuente
XCODE 10.1 / SWIFT 4.2:
Agregar los permisos requeridos (otros mencionados)
Agregue esta clase a su vista:
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.") } } }
fuente
Haga esto para mostrar codificación rápida de imágenes de la biblioteca de fotos:
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)] }
fuente
Sé que esta pregunta tiene un año, pero aquí hay un código bastante simple (principalmente de este tutorial ) que me está funcionando bien:
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) }
fuente
Para Swift 4 ¡
Este código funciona para mí!
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) } }
fuente
Por supuesto, las respuestas anteriores resuelven el problema principal.
Me enfrenté a un bloqueo en Swift 3.0 al iniciar el álbum de fotos porque Info.plist no tenía estas banderas:
Privacidad - Descripción del uso de la biblioteca de fotos -> NSPhotoLibraryUsageDescription
Privacidad - Descripción del uso de la cámara -> NSCameraUsageDescription
[
Añádalos si tiene un problema similar.
Gracias !
fuente
aquí hay una manera fácil de hacerlo:
pero primero debe agregar (Privacidad - Descripción de uso de la biblioteca de fotos) en el info.plist, y debe tener un botón y un UIImageView en su viewController.
luego cree una salida de UIImageView (en este código, la salida se llama myImage) y una acción del botón (llamé a la acción de importación en mi código)
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 } }
fuente
En caso de que no desee tener un botón separado, aquí hay otra forma. Adjunto un gesto en imageView, donde al tocar la imagen aparecerá una alerta con dos opciones. Tendrá la opción de elegir entre la galería / biblioteca de fotos o cancelar la alerta.
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") } }
Agregando más a la pregunta, implementó la lógica para almacenar imágenes en CoreData.
fuente
haga clic en el botón y abra la galería de imágenes y configure la imagen en imageview swift 3.0
agregue tres delegados 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) }
fuente
Solo respondiendo aquí para mencionar:
info[UIImagePickerControllerEditedImage]
es probablemente el que desea usar en la mayoría de los casos.Aparte de eso, las respuestas aquí son completas.
fuente
Pruebe este, es fácil ... Fotografiar una imagen usando 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) }
fuente
Si desea elegir solo una imagen normal, puede usar el siguiente código, que verifique que la imagen elegida no sea una imagen panorámica.
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) }
fuente
Xcode 10, Swift 4.2
A continuación se muestra una versión ligeramente optimizada de la implementación. Esto está en Swift 4.2 y también lo he probado.
Puede ver el código completo de ViewController aquí. Tenga en cuenta que debe definir un IBOutlet (imageView) y un IBAction (didTapOnChooseImageButton) definidos y conectados en el guión gráfico también. Espero que esto ayude.
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") } }
fuente
Puedes hacer como aquí
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) }
Espero que esto haya sido útil
fuente
Para Swift 3.4.1, este código está funcionando:
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); } }
fuente
@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)") } }
Agregar
UINavigationControllerDelegate
,UIImagePickerControllerDelegate
delegados en la definición de clasefuente