Using the camera and photo library lets users take pictures or pick photos from their device. This makes apps more interactive and personal.
Camera and photo library in iOS Swift
import UIKit class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { func openCamera() { guard UIImagePickerController.isSourceTypeAvailable(.camera) else { return } let picker = UIImagePickerController() picker.sourceType = .camera picker.delegate = self present(picker, animated: true) } func openPhotoLibrary() { let picker = UIImagePickerController() picker.sourceType = .photoLibrary picker.delegate = self present(picker, animated: true) } func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { if let image = info[.originalImage] as? UIImage { // use the selected image } picker.dismiss(animated: true) } }
Use UIImagePickerController to access camera or photo library.
Set sourceType to .camera or .photoLibrary depending on what you want.
let picker = UIImagePickerController() picker.sourceType = .camera present(picker, animated: true)
let picker = UIImagePickerController() picker.sourceType = .photoLibrary present(picker, animated: true)
This app shows two buttons: one to open the camera and one to open the photo library. When the user picks or takes a photo, it appears on the screen.
import UIKit class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { let imageView = UIImageView() let cameraButton = UIButton(type: .system) let libraryButton = UIButton(type: .system) override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .white imageView.frame = CGRect(x: 50, y: 100, width: 300, height: 300) imageView.contentMode = .scaleAspectFit view.addSubview(imageView) cameraButton.frame = CGRect(x: 50, y: 420, width: 140, height: 50) cameraButton.setTitle("Open Camera", for: .normal) cameraButton.addTarget(self, action: #selector(openCamera), for: .touchUpInside) view.addSubview(cameraButton) libraryButton.frame = CGRect(x: 210, y: 420, width: 140, height: 50) libraryButton.setTitle("Open Library", for: .normal) libraryButton.addTarget(self, action: #selector(openPhotoLibrary), for: .touchUpInside) view.addSubview(libraryButton) } @objc func openCamera() { guard UIImagePickerController.isSourceTypeAvailable(.camera) else { return } let picker = UIImagePickerController() picker.sourceType = .camera picker.delegate = self present(picker, animated: true) } @objc func openPhotoLibrary() { let picker = UIImagePickerController() picker.sourceType = .photoLibrary picker.delegate = self present(picker, animated: true) } func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { if let image = info[.originalImage] as? UIImage { imageView.image = image } picker.dismiss(animated: true) } func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { picker.dismiss(animated: true) } }
Always check if the camera is available before opening it to avoid crashes.
Remember to add usage descriptions in your app's Info.plist for camera and photo library access.
Handle user denial of permissions gracefully.
Use UIImagePickerController to let users take or pick photos.
Set sourceType to .camera or .photoLibrary accordingly.
Implement delegate methods to get the selected or taken image.
Practice
sourceType to .camera in UIImagePickerController?Solution
Step 1: Understand
ThesourceTypeusagesourceTypeproperty ofUIImagePickerControllerdefines where the image will come from.Step 2: Identify the effect of
Setting.camerasourceTypeto.cameraopens the device camera to take a new photo.Final Answer:
To allow the user to take a new photo using the device camera -> Option CQuick Check:
sourceType = .camerameans take new photo [OK]
- Confusing .camera with .photoLibrary
- Thinking .camera records video by default
- Assuming .camera opens settings
UIImagePickerController and set its delegate in Swift?Solution
Step 1: Correct initialization syntax
In Swift,UIImagePickerController()requires parentheses to create an instance.Step 2: Assign delegate properly
The delegate is assigned asselfwithout parentheses because it is a property, not a function call.Final Answer:
let picker = UIImagePickerController() picker.delegate = self -> Option BQuick Check:
Initialize with () and assign delegate without () [OK]
- Forgetting parentheses when creating UIImagePickerController
- Using parentheses when assigning delegate
- Declaring picker without parentheses
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
if let image = info[.originalImage] as? UIImage {
print("Image selected")
} else {
print("No image found")
}
}Solution
Step 1: Check the delegate method behavior
The methodimagePickerController(_:didFinishPickingMediaWithInfo:)is called after user picks a photo.Step 2: Understand the info dictionary
Theinfodictionary contains the key.originalImagewith the selected UIImage if successful.Final Answer:
Image selected -> Option DQuick Check:
Image exists in info dictionary after selection [OK]
- Assuming image is nil after selection
- Confusing delegate method names
- Not casting info dictionary value properly
let picker = UIImagePickerController() picker.sourceType = .camera picker.delegate = self present(picker, animated: true)
Solution
Step 1: Check delegate conformance requirements
To useUIImagePickerControllerdelegate methods, the class must conform toUIImagePickerControllerDelegateandUINavigationControllerDelegate.Step 2: Identify missing conformance
If the class does not conform, delegate methods won't be called and picker won't work properly.Final Answer:
Missing UIImagePickerControllerDelegate and UINavigationControllerDelegate conformance -> Option AQuick Check:
Delegate protocols must be adopted for picker to work [OK]
- Forgetting to add delegate protocols to class
- Assigning delegate after presenting picker
- Using wrong sourceType value
Solution
Step 1: Understand
A singlesourceTypeflexibilityUIImagePickerControllercan have itssourceTypeset to either.cameraor.photoLibrarybefore presenting.Step 2: Handle user choice before presenting picker
Based on user selection, set thesourceTypedynamically and present the picker once.Final Answer:
Set sourceType dynamically based on user choice, then present a single UIImagePickerController -> Option AQuick Check:
One picker, sourceType changes per user choice [OK]
- Trying to present two pickers at once
- Using savedPhotosAlbum to cover camera
- Mixing custom UI unnecessarily
Ready to prove it?
Pass the test and this pattern moves unknown
