The code is perfectly working in iOS 10 and below. But, in iOS 11 after cancel the photo library and open the camera its always opens the photo library. This is only happening in iOS 11.
Code is compiled in Xcode 9 Beta 4.
Code below:
@IBAction func buttonProfilePicPressed(_ sender: 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.openGallary()
}))
alert.addAction(UIAlertAction.init(title: "Cancel", style: .cancel, handler: nil))
self.present(alert, animated: true, completion: nil)
imgPicker.delegate = self
self.present(imgPicker, animated: true, completion: nil)
}
func openCamera()
{
if(UIImagePickerController .isSourceTypeAvailable(UIImagePickerControllerSourceType.camera))
{
imgPicker.sourceType = UIImagePickerControllerSourceType.camera
imgPicker.allowsEditing = true
self.present(imgPicker, 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()
{
imgPicker.sourceType = UIImagePickerControllerSourceType.photoLibrary
imgPicker.allowsEditing = true
self.present(imgPicker, animated: true, completion: nil)
}
Meanwhile, from the user’s perspective, it is a very welcome change. Users can now have more control over the privacy of their photos, limiting the number of photos an app can access. With this new permission status, the way to handle photo library permission in iOS 14 is very different from the previous iOS versions.
Head back to the viewDidLoad () method and add the following line of code: That’s it for observing photo library change. Our custom image picker should now be able to display the correct amount of selected photos every time selected photos changes.
If you designate a new library as the System Photo Library and then turn on iCloud Photos, the photos and videos in the new library will merge with those already in your iCloud Photos. If you want to keep the contents of your photo libraries separate, don’t turn on iCloud Photos for more than one library in Photos.
Designate a System Photo Library in Photos. If you have multiple photo libraries on your Mac, you can choose one to be the System Photo Library. The System Photo Library is the only library that can be used with iCloud Photos, Shared Albums, and My Photo Stream.
I found what's wrong.
MAIN: You must set sourceType before you present UIImagePickerController. About this you can read in documentation UIImagePickerController.
Yes, you can see documentation for sourceType, but information about sourceType on documentation page is wrong or not actual for iOS 11.
In result:
in your case you need remove only one row:
@IBAction func buttonProfilePicPressed(_ sender: UIButton)
{
...
self.present(imgPicker, animated: true, completion: nil) //REMOVE IT!!!!!111
}
P.S. Checked and work on Xcode 9 GM
func startCameraFromViewController(_ viewController: UIViewController, withDelegate delegate:
UIImagePickerControllerDelegate & UINavigationControllerDelegate) -> Void {
if (UIImagePickerController.isSourceTypeAvailable(.camera) == false) {
print("fail")
}
let cameraController = UIImagePickerController()
cameraController.sourceType = .camera
cameraController.allowsEditing = true
cameraController.delegate = delegate
present(cameraController, animated: true, completion: nil)
}
This is the code that works for me. Same problem on iOS 11, but working with this. Maybe you need to remove self.present(imgPicker, animated: true, completion: nil)
in buttonProfilePicPressed
method.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With