Сбросить авторотацию в Xcode после принудительной альбомной ориентации в одном контроллере представления (swift 4)

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

Чтобы заставить эту ориентацию, я установил значение ориентации lanscape через AppDelegate:

AppDelegate.swift

var shouldSupportAllOrientation = true
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
    if (shouldSupportAllOrientation == true){
       return UIInterfaceOrientationMask.all
    }
    return UIInterfaceOrientationMask.landscape
}

ViewController.swift

let appdelegate = UIApplication.shared.delegate as! AppDelegate
appdelegate.shouldSupportAllOrientation = false
let value = UIInterfaceOrientation.landscapeRight.rawValue
UIDevice.current.setValue(value, forKey: "orientation")

Но когда приложение переходит к другому контроллеру представления, а устройство находится в портретной ориентации (физически), представления отображаются в ландшафтном режиме до тех пор, пока устройство не будет повернуто.

Есть ли способ определить «реальную ориентацию устройства»?

Спасибо


person RFG    schedule 11.06.2018    source источник
comment
Вы имели в виду UIDeviceOrientation под реальной ориентацией устройства?   -  person Jasveer Singh    schedule 11.06.2018
comment
Я имею в виду ориентацию устройства, а не ориентацию, которую показывает контроллер представления. Это связано с тем, что если я принудительно выберу альбомную ориентацию и переведу устройство в портретный режим, контроллер представления появится в ландшафтном режиме (потому что я принудительно перейду к этой ориентации), но если из этой ситуации я вернусь назад, ориентация устройства (все еще портретная) будет отличаться из контроллера представления (остается альбомным, когда я устанавливаю allOrientations в значение true). Не знаю, хорошо ли я объяснил проблему.   -  person RFG    schedule 11.06.2018


Ответы (1)


Я столкнулся с аналогичной проблемой. После принудительного использования UIDevice.current.orientation кажется, что устройство больше не может его обновлять (что выглядит ожидаемо, поскольку это свойство только для получения и представляет физическую ориентацию)

Попробуйте переопределить supportedInterfaceOrientations в ViewController.swift:

override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return .landscape
}

После этого, если вы откроете этот VC, interfaceOrientation будет альбомным, а UIDevice.current.orientation - настоящим. Просто примечание: вы можете изменить ширину и высоту вашего представления, если вы работаете с фреймами и границами.

person Dan O    schedule 07.07.2019