How to make UIImagePickerController for camera and photo library at the same time in swift How to make UIImagePickerController for camera and photo library at the same time in swift ios ios

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)    }

Download sample project for Swift, SwiftUI


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>

enter image description here

100% working and tested