Hoe u UIImagePickerController voor camera en fotobibliotheek tegelijkertijd snel maakt

Ik gebruik UIImagePickerController om een ​​foto te maken met de camera van de iPhone.

Ik wil zowel “neem een ​​foto” als “kies een foto” laten zien.

Mijn code

imagePicker =  UIImagePickerController()
imagePicker.delegate = self
imagePicker.sourceType = .camera
//imagePicker.sourceType = .PhotoLibrary
presentViewController(imagePicker, animated: true, completion: nil)

Ik heb geprobeerd imagePicker.sourceType = .Cameraen imagePicker.sourceType = .PhotoLibrarysamen te gebruiken om dit te doen, maar het werkt niet…

Bedankt


Antwoord 1, autoriteit 100%

Importeer UIImagePickerControllerDelegateen maak een variabele om UIImagePickerController toe te wijzen
var imagePicker = UIImagePickerController() en stel imagePicker.delegate = selfin.

Maak een actieblad om de opties voor ‘Camera’ en ‘Fotobibliotheek’ weer te geven.

Op uw knopklikactie:

@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 voorbeeldproject voor Swift, SwiftUI


Antwoord 2, autoriteit 69%

Swift 5 +:

Actieblad met camera en galerij:

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

Functie camerabeeldkiezer:

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

Functie voor het kiezen van afbeeldingen in de galerij:

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-gemachtigde:

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

Antwoord 3, autoriteit 17%

gemachtigde instellen als:

UIImagePickerControllerDelegate,UINavigationControllerDelegate

neem één afbeeldingsweergave zodat we de geselecteerde/vastgelegde afbeelding kunnen weergeven:

@IBOutlet weak var imageViewPic: UIImageView!

Voor het vastleggen van een nieuwe afbeelding met de camera van het apparaat:

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

Voor geselecteerde foto uit galerij:

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

Dit is de gedelegeerde methode:

    //MARK: - ImagePicker delegate
func 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)
}

stel toestemming in voor toegang tot camera en foto in info.plistzoals:

<key>NSCameraUsageDescription</key>
<string>This app will use camera</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>You can select photo</string>

voer hier de afbeeldingsbeschrijving in

100% werkend en getest


Antwoord 4, autoriteit 4%

Maak een weergavecontroller en voeg een knop en afbeelding toe aan het storyboard

voeg UIImagePickerControllerDelegate,UINavigationControllerDelegate-protocollen toe in de weergavecontroller

camera-actieknop voer de volgende code in

let imagePickerController = UIImagePickerController()
    imagePickerController.delegate = self
    let actionsheet = UIAlertController(title: "Photo Source", message: "Choose A Sourece", preferredStyle: .actionSheet)
    actionsheet.addAction(UIAlertAction(title: "Camera", style: .default, handler: { (action:UIAlertAction)in
        if UIImagePickerController.isSourceTypeAvailable(.camera){
            imagePickerController.sourceType = .camera
            self.present(imagePickerController, animated: true, completion: nil)
        }else
        {
            print("Camera is Not Available")
        }
    }))
    actionsheet.addAction(UIAlertAction(title: "Photo Library", style: .default, handler: { (action:UIAlertAction)in
        imagePickerController.sourceType = .photoLibrary
        self.present(imagePickerController, animated: true, completion: nil)
    }))
    actionsheet.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
    self.present(actionsheet,animated: true, completion: nil)

Voeg de volgende functie toe in de weergavecontroller

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    let image = info[UIImagePickerControllerOriginalImage] as! UIImage
    imageView.image = image
    picker.dismiss(animated: true, completion: nil)
    }
    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
    picker.dismiss(animated:  true, completion: nil)
    }
}

in info.plist rij toevoegen met

Privacy - Photo Library Usage Description
Privacy - Camera Usage Description

Antwoord 5, autoriteit 4%

Ik heb dit prachtige project gemaakt en met deze vier regels code krijg je een afbeelding van de camera of de bibliotheek en pas je prachtige filters toe met een enkele regel zoals deze: –

let picker = PickerController()
picker.applyFilter = true // to apply filter after selecting the picture by default false
picker.selectImage(self){ image in
    // Use the picture
}

voer hier de afbeeldingsbeschrijving in

Hier is de link van het project.


Antwoord 6, autoriteit 2%

//MARK:- Camera and Gallery
    func showActionSheet(){
        //Create the AlertController and add Its action like button in Actionsheet
        let actionSheetController: UIAlertController = UIAlertController(title: NSLocalizedString("Upload Image", comment: ""), message: nil, preferredStyle: .actionSheet)
        actionSheetController.view.tintColor = UIColor.black
        let cancelActionButton: UIAlertAction = UIAlertAction(title: NSLocalizedString("Cancel", comment: ""), style: .cancel) { action -> Void in
            print("Cancel")
        }
        actionSheetController.addAction(cancelActionButton)
        let saveActionButton: UIAlertAction = UIAlertAction(title: NSLocalizedString("Take Photo", comment: ""), style: .default)
        { action -> Void in
            self.camera()
        }
        actionSheetController.addAction(saveActionButton)
        let deleteActionButton: UIAlertAction = UIAlertAction(title: NSLocalizedString("Choose From Gallery", comment: ""), style: .default)
        { action -> Void in
            self.gallery()
        }
        actionSheetController.addAction(deleteActionButton)
        self.present(actionSheetController, animated: true, completion: nil)
    }
    func camera()
    {
        let myPickerControllerCamera = UIImagePickerController()
        myPickerControllerCamera.delegate = self
        myPickerControllerCamera.sourceType = UIImagePickerController.SourceType.camera
        myPickerControllerCamera.allowsEditing = true
        self.present(myPickerControllerCamera, animated: true, completion: nil)
    }
    func gallery()
    {
        let myPickerControllerGallery = UIImagePickerController()
        myPickerControllerGallery.delegate = self
        myPickerControllerGallery.sourceType = UIImagePickerController.SourceType.photoLibrary
        myPickerControllerGallery.allowsEditing = true
        self.present(myPickerControllerGallery, animated: true, completion: nil)
    }
    //MARK:- ***************  UIImagePickerController delegate Methods ****************
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        // The info dictionary may contain multiple representations of the image. You want to use the original.
        guard let selectedImage = info[.originalImage] as? UIImage else {
            fatalError("Expected a dictionary containing an image, but was provided the following: \(info)")
        }
        // Set photoImageView to display the selected image.
        imageUserProfile.image = selectedImage
        // Dismiss the picker.
        dismiss(animated: true, completion: nil)
    }

Antwoord 7

Swift 5 Gemakkelijke manier om gewoon te bellen

//MARK Life Cycles
override func viewDidLoad() {
    super.viewDidLoad()
    choosePicture
}
extension AddBook: UIPickerViewDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
@objc func choosePicture(){
    let alert  = UIAlertController(title: "Select Image", message: "", preferredStyle: .actionSheet)
    alert.modalPresentationStyle = .overCurrentContext
    alert.addAction(UIAlertAction(title: "Camera", style: .default, handler: { (action) in
        self.openCamera()
    }))
    alert.addAction(UIAlertAction(title: "Photo Library", style: .default, handler: { (action) in
        self.openGallary()
    }))
    alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
    let popoverController = alert.popoverPresentationController
    popoverController?.permittedArrowDirections = .up
    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)
}
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
    picker.dismiss(animated: true, completion: nil)
}
private func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    // picker.supportedInterfaceOrientations = .
    if let image  = info[UIImagePickerController.InfoKey.originalImage.rawValue] as? UIImage {
            if btnPicOther.tag == 1 {
                btnPicOther.setImage(image, for: .normal)
            }
            else if btnPicBack.tag == 1 {
                btnPicBack.setImage(image, for: .normal)
            }
            else if btnPicFront.tag == 1{
                btnPicFront.setImage(image, for: .normal)
            }
            picker.dismiss(animated: true, completion: nil)
        }
    }
}

Antwoord 8

Swift 5:je mag het onderstaande camerabeeld gebruiken:
voer hier de afbeeldingsbeschrijving in

  1. Een project maken

  2. Voeg in het hoofdverhaalbord onderaan twee knoppen toe & afbeelding toevoegenBekijken & link naar viewController.

  3. Voeg Privacy – Beschrijving cameragebruiktoe in Info.plistzoals hieronder:
    voer hier de afbeeldingsbeschrijving in

  4. Plak onderstaande code in view controller:

    class ViewController: UIViewController {
       @IBOutlet weak var imageView: UIImageView!
       override func viewDidLoad() {
          super.viewDidLoad()       
        }
     @IBAction func btnPhotGalary(_ sender: Any) {
        let picker = UIImagePickerController()
        picker.sourceType = .photoLibrary
        picker.delegate = self
        present(picker, animated: true)
      }
    @IBAction func btnCapture(_ sender: Any) {
      let picker = UIImagePickerController()
      picker.sourceType = .camera
      //for camera front
      // picker.cameraDevice = .front
       picker.delegate = self
       picker.allowsEditing = false
       present(picker, animated: true)
      }
      }
      extension ViewController :UIImagePickerControllerDelegate,UINavigationControllerDelegate{
    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        picker.dismiss(animated: true, completion: nil)
      }
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        picker.dismiss(animated: true, completion: nil)
        guard let originalImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage else {
         return
       }
        //for image rotation
        let image =  originalImage.upOrientationImage()
        imageView.image = image
      }
    }
     extension UIImage {
        func upOrientationImage() -> UIImage? {
         switch imageOrientation {
            case .up:
             return self
         default:
           UIGraphicsBeginImageContextWithOptions(size, false, scale)
            draw(in: CGRect(origin: .zero, size: size))
            let result = UIGraphicsGetImageFromCurrentImageContext()
              UIGraphicsEndImageContext()
            return result
           }
         }
     }
    
  1. Volledige bron wordt gegeven in GitHub: https://github.com/enamul95/UIImagePicker.git

Other episodes