Сбой приложения с помощью UIImagePickerController в ландшафтном режиме только на iPhone X (iOS 12) - PullRequest
0 голосов
/ 19 ноября 2018

Создан проект в Xcode 10.1 с альбомной ориентацией устройства только влево и вправо.

Добавлен следующий ключ в Plist

Конфиденциальность - описание использования камеры: «Используется для съемки»

   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)

        }
    }

}

Над кодом работает нормально на следующих устройствах

iPhone 8 (iOS 12)

iPhone 7 (iOS 11.4.1)

iPad mini (iOS 11)

Но когда я запускаю это в iPhoneX с iOS 12.1, то получаю следующую ошибку.

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

Я провел исследование по этой проблеме, но пока не могу найти решение. Вот несколько ссылок, которые я нашел для связанной проблемы, но ни один из ответов не работает на iPhoneX.

Использование UIImagePickerController в альбомной ориентации

Интерфейс контроллера UIImagePickerOrentation Crash

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

1 Ответ

0 голосов
/ 19 ноября 2018

Я тоже долго сталкивался с этой проблемой и нашел решение после стольких RND:

Шаг 1: Создайте пользовательский контроллер UIImage и используйте его. Код для того же ниже

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
    }

}

Шаг 2. Создайте глобальный флаг isOpenGallery и перед открытием галереи сделайте его истинным, а установите его как ложное незадолго до того, как MyImagepickercontroller и в вашем приложении Delegate реализуют следующий код:

  func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
    return isOpenGallery ? UIInterfaceOrientationMask.portrait : UIInterfaceOrientationMask.landscape
}
...