我想使用 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 仅横向。
从"设备方向"开始,最初将其设为纵向。
在 AppDelegate 中,创建一个变量"方向",并将其值设置为 UIInterfaceOrientationMask.portrait
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
...
var orientation = UIInterfaceOrientationMask.portrait
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
return orientation
}
}
现在在您想要的视图控制器中写下这个来改变方向
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")
}
希望对您有所帮助。
另一个答案似乎过于复杂,并且使用私有API。在视图控制器中,要设置支持的方向,只需覆盖supportedInterfaceOrientations
。
例如,要将其锁定为纵向:
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
.portrait
}