Невозможно заблокировать вращение для одного контроллера представления в IOS10 - PullRequest
5 голосов
/ 09 июля 2019

Фон

У меня есть приложение, которое использует AVFoundation для того, чтобы иметь собственную камеру. Это происходит в OCRViewController. Когда я делаю снимок, я отправляю снятый снимок в другой вид ImagePreviewViewController.

Я использую Xcode 10.2.1 (10E1001) с Swift 5

Цель

Чего я хотел бы добиться, так это зафиксировать ориентацию ImagePreviewViewController относительно исходной ориентации изображения. Я уже знаю, как получить ориентацию изображения, но не могу заблокировать ориентацию вида.

Я получаю поворот изображения следующим образом: let imageOri = capturedImage?.imageOrientation

Что я пробовал?

Я попробовал принятые ответы в нескольких других источниках:

Как заблокировать ориентацию только для одного контроллера вида?

Как привязать ориентацию одного контроллера вида к портретному режиму только в Swift

https://www.hackingwithswift.com/example-code/uikit/how-to-lock-a-view-controllers-orientation-using-supportedinterfaceorientations

Чтение документации по https://developer.apple.com/documentation/uikit/uiviewcontroller#//apple_ref/occ/instm/UIViewController/supportedInterfaceOrientations в Обработка вращения вида указано следующее:

Я также попробовал множество предложенных решений при написании этого запроса, однако большинство, похоже, использует следующий подход (или его вариант), и он не работает для меня.

override func supportedInterfaceOrientations() -> Int {
    return Int(UIInterfaceOrientationMask.Portrait.rawValue)
}

override func shouldAutorotate() -> Bool{
    return false
}

override func preferredInterfaceOrientationForPresentation() -> UIInterfaceOrientation {
    return UIInterfaceOrientation.Portrait
}

Начиная с iOS 8, все методы, связанные с ротацией, устарели. Вместо этого повороты обрабатываются как изменение размера представления контроллера представления и поэтому сообщаются с использованием метода viewWillTransition (to: with :).

Однако я не уверен, как продвигаться дальше.

Интересные фрагменты кода

Следующий метод в моем OCRViewController, здесь я создаю экземпляр ImagePreviewViewController и прикрепляю захваченное изображение.

func displayCapturedPhoto(capturedPhoto : UIImage) {
    let imagePreviewViewController = storyboard?.instantiateViewController(withIdentifier: "ImagePreviewViewController") as! ImagePreviewViewController
    imagePreviewViewController.capturedImage = capturedPhoto
    navigationController?.pushViewController(imagePreviewViewController, animated: true)
}

Используя приведенную ниже функцию переопределения внутри моего ImagePreviewViewController, я могу определить ориентацию контроллера вида.

override func viewDidAppear(_ animated: Bool) {
    if UIDevice.current.orientation.isLandscape {
        print("Landscape")
    } else {
        print("Portrait")
    }
}

1 Ответ

1 голос
/ 25 июля 2019

Чтобы ограничить вращение одного экрана, используйте это.

В AppDelegate

var restrictRotation = Bool()

func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
    if !restrictRotation {
        return .portrait
    } else {
        return .all
    }
}

В вашем контроллере представления добавьте функцию,

func restrictRotation(restrict : Bool) -> Void {
    let appDelegate = UIApplication.shared.delegate as? AppDelegate
    appDelegate?.restrictRotation = restrict
}

В ViewDidload(), вызовите функцию, чтобы отключить вращение.

    self.restrictRotation(restrict: false)

в методе viewWillDisappear (), вызовите функцию, чтобы включить вращение.

    self.restrictRotation(restrict: true)
...