In my iOS app I have an ImageView and two Buttons for opening the camera and the photolibrary. When I click on one of the buttons the app closes. (I'm running the app on my device, not the simulator)
What do I have to change in my code?
class PhotoViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
@IBOutlet weak var ImageDisplay: UIImageView!
@IBOutlet weak var libraryOutlet: UIButton!
@IBOutlet weak var cameraOutlet: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
@IBAction func openCameraButton(_ sender: UIButton) {
let picker = UIImagePickerController()
picker.delegate = self
picker.sourceType = .camera
present(picker, animated: true, completion: nil)
}
@IBAction func openLibraryButton(_ sender: UIButton) {
let picker = UIImagePickerController()
picker.delegate = self
picker.sourceType = .photoLibrary
present(picker, animated: true, completion: nil)
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
ImageDisplay.image = info[UIImagePickerControllerOriginalImage] as? UIImage
dismiss(animated: true, completion: nil)
}
}
In iOS 10 you need permission to access photoLibrary or camera by adding below keys to your plist and you need to use the proper delegate method.
To Access Photo Library:
@IBAction func library(_ sender: UIButton) {
if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.photoLibrary) {
let imagePicker = UIImagePickerController()
imagePicker.delegate = self
imagePicker.sourceType = UIImagePickerControllerSourceType.photoLibrary
imagePicker.allowsEditing = true
self.present(imagePicker, animated: true, completion: nil)
}
}
To Access Device Camera:
@IBAction func camera(_ sender: UIButton) {
if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.camera) {
imagePicker.delegate = self
imagePicker.sourceType = UIImagePickerControllerSourceType.camera;
imagePicker.allowsEditing = false
self.present(imagePicker, animated: true, completion: nil)
}
}
To Pick and display Image:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
ImageDisplay.image = image
}
picker.dismiss(animated: true, completion: nil);
}
Output:
If you are running on iOS10, you have to add entries in Info.plist for accessing camera
put this key in Info.plist
Privacy-Camera Usage Description
http://useyourloaf.com/blog/privacy-settings-in-ios-10/
If not the app would crash as is happening in your case
If you are developing the app in ios 10 , then have to add the privacy permission setting in your info.plist and describe something where you need this privacy.
Privacy Setting List:
Bluetooth Sharing – NSBluetoothPeripheralUsageDescription
Calendar – NSCalendarsUsageDescription
CallKit – NSVoIPUsageDescription
Camera – NSCameraUsageDescription
Contacts – NSContactsUsageDescription
Health – NSHealthShareUsageDescription & NSHealthUpdateUsageDescription
HomeKit – NSHomeKitUsageDescription
Location – NSLocationUsageDescription, NSLocationAlwaysUsageDescription,
NSLocationWhenInUseUsageDescription
Media Library – NSAppleMusicUsageDescription
Microphone – NSMicrophoneUsageDescription
Motion – NSMotionUsageDescription
Photos – NSPhotoLibraryUsageDescription
Reminders – NSRemindersUsageDescription
Speech Recognition – NSSpeechRecognitionUsageDescription
SiriKit – NSSiriUsageDescription
TV Provider – NSVideoSubscriberAccountUsageDescription
iOS 10 is not allowed to access the Contact, Camera, Photo library, User location and so on until we mention Why we are using it.open your plist as Source code add the below code under dict Now run it again.
<!--