iOS 13 UIWindowScene как заблокировать ориентацию?

Я хочу использовать SceneDelegate, UIWindowScene, UIWindowSceneDelegate и другие вещи, связанные с UIScene.

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    guard let windowScene = (scene as? UIWindowScene) else { return }

    window = UIWindow.init(frame: windowScene.coordinateSpace.bounds)
    window?.windowScene = windowScene

    let vc = UIStoryboard(name: "FCBottomTabBar", bundle: nil).instantiateInitialViewController()!
    window?.rootViewController = vc
    window?.makeKeyAndVisible()
}

Как я могу динамически заблокировать ориентацию этого окна? Например дляportraitтолько? Динамически означает, что во время выполнения, когда пользователь взаимодействует с чем-то, ориентация блокируется для всех.

Например, для экрана A мне нужно заблокировать только портретную ориентацию. Для экрана B только альбомный.

2 ответа

Этот другой ответ кажется слишком сложным и использует частный API. В контроллере представления, чтобы установить поддерживаемые ориентации, просто переопределите supportedInterfaceOrientations.

Например, чтобы зафиксировать книжную ориентацию:

      override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    .portrait
}

Из "Ориентация устройства" изначально сделайте его портретным.

В AppDelegate создайте переменную "ориентация" и установите для нее значение UIInterfaceOrientationMask.portrait.

import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    ...
    var orientation = UIInterfaceOrientationMask.portrait
    func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
        return orientation
    }
}

Теперь в желаемом ViewController напишите это, чтобы изменить ориентацию

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    (UIApplication.shared.delegate as! AppDelegate).orientation = .landscapeLeft
    let value = UIInterfaceOrientation.landscapeLeft.rawValue
    UIDevice.current.setValue(value, forKey: "orientation")
    
}

Надеюсь, это поможет вам.

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