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")
}
Надеюсь, это поможет вам.