0

Created Project in Xcode 10.1 with Device Orientation Landscape Left and Right Only.

Added the following Key in Plist

Privacy - Camera Usage Description: “Used for taking Picture”

   import UIKit

class UploadViewController: UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate

{
    //MARK:- ViewDidLoad
    override func viewDidLoad() {
        super.viewDidLoad()


    }

 @IBAction func cameraButtonAction(_ sender: UIButton)
    {

        if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.camera){

            let imagePicker = UIImagePickerController()
            imagePicker.sourceType = .camera
            imagePicker.modalPresentationStyle = .overCurrentContext
            imagePicker.delegate =  self
            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)

        }
    }

}

Above code working fine in following devices

iPhone 8 (iOS 12)

iPhone 7 (iOS 11.4.1)

iPad mini (iOS 11)

But When I run this in iPhoneX with iOS 12.1, then Getting following error.

Terminating app due to uncaught exception 'UIApplicationInvalidInterfaceOrientation', reason: 'Supported orientations has no common orientation with the application, and [CAMViewfinderViewController shouldAutorotate] is returning YES'
*** First throw call stack:

libc++abi.dylib: terminating with uncaught exception of type NSException

I did the research on this issue but I'm not able to find the solution yet. Here are few links that I found for the related issue but none of the answers working for iPhoneX.

Using UIImagePickerController in landscape orientation

UIImagePickerController InterfaceOrientation Crash

https://www.reddit.com/r/iOSProgramming/comments/3xpwot/discussion_lets_talk_about_landscape_cameras/

Vishal Khatri
  • 954
  • 2
  • 12
  • 32

1 Answers1

3

I was also facing this issue since long and found a solution after doing so many RND's :

Step 1: Make Custom UIImage picker controller and use it. Code for same is below

class MyImagePickerViewController: UIImagePickerController {

    override public func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    override public var shouldAutorotate: Bool {
        return false
    }

    override public var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return UIInterfaceOrientationMask.landscape // Since your app is in only landscape mode
    }

}

Step 2: Make a global flag isOpenGallery and just before opening gallery make it true and make it false just before dismiss MyImagepickercontroller and In your App Delegate implement following code:

  func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
    return isOpenGallery ? UIInterfaceOrientationMask.portrait : UIInterfaceOrientationMask.landscape
}
Vitul Goyal
  • 95
  • 1
  • 7