Ориентация UIDevice возвращает портрет, когда устройство запускается как альбомная - PullRequest
0 голосов
/ 05 ноября 2018

Вот пример кода, который будет напечатан, если устройство «книжное» или «альбомное» при первом запуске, а также при обнаружении изменения ориентации.

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        getOrientation()
    }

    func getOrientation() {
        let orientation = UIDevice.current.orientation
        if orientation == .landscapeLeft || orientation == .landscapeRight {
            print("landscape")
        }
        else {
            print("portrait")
        }
    }
    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        getOrientation()
    }
}

Если я запускаю приложение с портретом телефона, оно работает нормально. Однако, если я запускаю приложение с телефоном в альбомной ориентации, оно сначала обнаружит портрет. Но если потом повернуть устройство, это будет правильно. Это ошибка или я неправильно использую UIDevice.current.orientation?

Ответы [ 4 ]

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

Обновите ваш тестовый код

func getOrientation() {
     let orientation = UIDevice.current.orientation
        if orientation == .landscapeLeft || orientation == .landscapeRight {
            print("landscape")
     }
     else if orientation == .unknown{
            print("unknown")
     }else if orientation == .portrait || orientation == .portraitUpsideDown{
            print("portrait")
     }
}
0 голосов
/ 05 ноября 2018

Метод viewWillTransition запускается только при повороте устройства. Вы должны попытаться позвонить вашему getOrientation в viewDidAppear

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

Видите, ваш код совершенен, но вызов не является правильным. viewDidLoad метод не гарантирует ориентацию интерфейса или какие-либо свойства, связанные с пользовательским интерфейсом, он просто говорит, что view загружен, но в случае, если вы хотите гарантировать получение правильных деталей, вам следует вызвать его в DispatchQueue.main.async(execute: block) (Main queue), которая даст правильное значение orientation, иначе можно позвонить по номеру viewDidLayoutSubviews, но недостатком является многократный вызов в зависимости от размеров ваших просмотров и подпредставлений.

DispatchQueue.main.async {
    self.getOrientation()
}

Ссылка: view.frame.width является корректным в viewDidLoad с раскадровкой, почему?

Apple Docs: https://developer.apple.com/documentation/uikit/uiviewcontroller

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

Значение этого свойства всегда возвращает 0, что неизвестно, если только уведомления об ориентации не были включены путем вызова beginGeneratingDeviceOrientationNotifications().

...