iOS16+ Представление UIViewController в альбомной ориентации только для одного экрана не работает [Swift 5.7]
До iOS 16 представление одного экрана в альбомной ориентации было нормально для портретного приложения. Рабочий код приведен ниже.
Примечание . Все приложение работает только в портретном режиме.
override public var shouldAutorotate: Bool {
return false
}
override public var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return .landscapeLeft
}
override public var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
return .landscapeLeft
}
Я нашел решение, но оно для UIWindowScene , но мне нужно решение в UIWindow.Мне нужна помощь, чтобы исправить это в iOS 16.
Xcode — 14.0, iOS — 16.0, Симулятор — 14 Pro
Могу подготовить демо, если кому нужно.
1 ответ
После многих попыток я нашел простое решение. Как я уже упоминал в вопросе, все мое приложение находится только в портретном режиме и только один экран, который я хочу представить в альбомной ориентации.
Этот код не требует, чтобы какое-либо внешнее окно было
makeKeyAndVisible
.Если вы используете дополнительное окно для представления, вам нужно написать отдельно для закрытия для iOS 16.
Старый код, который работал в предыдущих версиях iOS 16, останется прежним и не изменится.
Волшебные линии, как показано ниже.
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
if let _ = window?.rootViewController?.presentedViewController as? LandscapeChartVC {
if #available(iOS 16.0, *) {
return .landscapeLeft
} else {
return .portrait
}
} else {
return .portrait
}
}
Я определил свой контроллер ландшафтного вида в файле appDelegate.supportedInterfaceOrientationsFor
.
Ну, вы можете изменить словоpresentedViewController
чтобы получить свой контроллер. Вот и все.
Добавьте поддержку iPad для всех 3 или 4 ориентаций следующим образом:
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
if UIDevice.IS_IPAD {
return .allButUpsideDown
} else {
if let _ = window?.rootViewController?.presentedViewController as? LandscapeChartVC {
if #available(iOS 16.0, *) {
return .landscapeLeft
} else {
return .portrait
}
} else {
return .portrait
}
}
Если требуется, чтобы приложение для iPad блокировало ориентацию, вы можете следовать коду iPhone / выше.
На эту идею придумали ответы и благодарим всех, кто поделился интересом. Если кто-то все еще получит более улучшенное решение, я буду рад обновить его.