How to make UIImagePickerController for camera and photo library at the same time in swift
Import UIImagePickerControllerDelegate
and create a variable to assign UIImagePickerControllervar imagePicker = UIImagePickerController()
and set imagePicker.delegate = self
.
Create an action sheet to display options for 'Camera' and 'Photo library'.
On your button click action:
@IBAction func buttonOnClick(_ sender: UIButton){ self.btnEdit.setTitleColor(UIColor.white, for: .normal) self.btnEdit.isUserInteractionEnabled = true let alert = UIAlertController(title: "Choose Image", message: nil, preferredStyle: .actionSheet) alert.addAction(UIAlertAction(title: "Camera", style: .default, handler: { _ in self.openCamera() })) alert.addAction(UIAlertAction(title: "Gallery", style: .default, handler: { _ in self.openGallary() })) alert.addAction(UIAlertAction.init(title: "Cancel", style: .cancel, handler: nil)) /*If you want work actionsheet on ipad then you have to use popoverPresentationController to present the actionsheet, otherwise app will crash on iPad */ switch UIDevice.current.userInterfaceIdiom { case .pad: alert.popoverPresentationController?.sourceView = sender alert.popoverPresentationController?.sourceRect = sender.bounds alert.popoverPresentationController?.permittedArrowDirections = .up default: break } self.present(alert, animated: true, completion: nil)}func openCamera() { if(UIImagePickerController .isSourceTypeAvailable(UIImagePickerController.SourceType.camera)) { imagePicker.sourceType = UIImagePickerController.SourceType.camera imagePicker.allowsEditing = true self.present(imagePicker, animated: true, completion: nil) } else { let alert = UIAlertController(title: "Warning", message: "You don't have camera", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) self.present(alert, animated: true, completion: nil) } } func openGallary() { imagePicker.sourceType = UIImagePickerController.SourceType.photoLibrary imagePicker.allowsEditing = true self.present(imagePicker, animated: true, completion: nil) }
Swift 5 +:
Action sheet with camera and gallery:
//MARK:- Image Picker @IBAction func imagePickerBtnAction(selectedButton: UIButton) { let alert = UIAlertController(title: "Choose Image", message: nil, preferredStyle: .actionSheet) alert.addAction(UIAlertAction(title: "Camera", style: .default, handler: { _ in self.openCamera() })) alert.addAction(UIAlertAction(title: "Gallery", style: .default, handler: { _ in self.openGallery() })) alert.addAction(UIAlertAction.init(title: "Cancel", style: .cancel, handler: nil)) self.present(alert, animated: true, completion: nil) }
Camera image picker functionality:
func openCamera(){ if UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.camera) { let imagePicker = UIImagePickerController() imagePicker.delegate = self imagePicker.sourceType = UIImagePickerController.SourceType.camera imagePicker.allowsEditing = false self.present(imagePicker, animated: true, completion: nil) } else { let alert = UIAlertController(title: "Warning", message: "You don't have camera", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) self.present(alert, animated: true, completion: nil) }}
Gallery image picker functionality:
func openGallery(){ if UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.photoLibrary){ let imagePicker = UIImagePickerController() imagePicker.delegate = self imagePicker.allowsEditing = true imagePicker.sourceType = UIImagePickerController.SourceType.photoLibrary self.present(imagePicker, animated: true, completion: nil) } else { let alert = UIAlertController(title: "Warning", message: "You don't have permission to access gallery.", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) self.present(alert, animated: true, completion: nil) }}
ImagePicker delegate:
//MARK:-- ImagePicker delegate func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { if let pickedImage = info[.originalImage] as? UIImage { // imageViewPic.contentMode = .scaleToFill } picker.dismiss(animated: true, completion: nil)}
set delegate like:
UIImagePickerControllerDelegate,UINavigationControllerDelegate
take one imageview so we can display selected/captured image:
@IBOutlet weak var imageViewPic: UIImageView!
For capture new image by using device camera:
if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.camera) { let imagePicker = UIImagePickerController() imagePicker.delegate = self imagePicker.sourceType = UIImagePickerControllerSourceType.camera imagePicker.allowsEditing = false self.present(imagePicker, animated: true, completion: nil) }
For select photo from gallery:
if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.photoLibrary){ let imagePicker = UIImagePickerController() imagePicker.delegate = self imagePicker.allowsEditing = true imagePicker.sourceType = UIImagePickerControllerSourceType.photoLibrary self.present(imagePicker, animated: true, completion: nil) }
This is the delegate method :
//MARK: - ImagePicker delegatefunc imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage { // imageViewPic.contentMode = .scaleToFill imageViewPic.image = pickedImage } picker.dismiss(animated: true, completion: nil)}
set permission for access camera and photo in info.plist like:
<key>NSCameraUsageDescription</key><string>This app will use camera</string><key>NSPhotoLibraryUsageDescription</key><string>You can select photo</string>
100% working and tested