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 / выше.

На эту идею придумали ответы и благодарим всех, кто поделился интересом. Если кто-то все еще получит более улучшенное решение, я буду рад обновить его.

Другие вопросы по тегам