这可以用两种方法完成。
1. 我个人更喜欢这种方式
1.1 将此功能保留在AppDelegate中以处理方向(这是必须的)
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
return .all
}
1.2 在你希望强制屏幕方向的 ViewController 中,前往该视图控制器并在变量声明部分添加以下代码:
var forceLandscape: Bool = false
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
forceLandscape ? .landscape : .portrait
}
我们将更新
forceLandscape,以便其得到更新,然后也会更新
supportedInterfaceOrientations。
在此,我们正在设置触发器以更新
forceLandscape(我们可以将这些代码行添加到按钮操作中以处理iOS 16强制旋转)。
if #available(iOS 16.0, *) {
self.forceLandscape = true
guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene else { return }
self.setNeedsUpdateOfSupportedInterfaceOrientations()
DispatchQueue.main.asyncAfter(deadline: .now() + 0.2, execute: {
windowScene.requestGeometryUpdate(.iOS(interfaceOrientations: .landscapeRight)){
error in
print(error)
print(windowScene.effectiveGeometry)
}
})
这将更新forceLandscape,因此它将检查方向并根据其更新
上述代码行是其中一种方法,另一种方法如下:
2. 另一种方法是在AppDelegate类中更新方向:
2.1 在AppDelegate中保留此函数和属性以处理方向(这是必须的)
var orientation : UIInterfaceOrientationMask = .portrait
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
return orientation
}
2.2 在视图控制器按钮操作中,我们可以更新属性。
@IBAction func buttonAction(_ sender: Any) {
let appDel = UIApplication.shared.delegate as! AppDelegate
appDel.orientation = .landscape
if #available(iOS 16.0, *) {
DispatchQueue.main.async {
let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene
self.setNeedsUpdateOfSupportedInterfaceOrientations()
self.navigationController?.setNeedsUpdateOfSupportedInterfaceOrientations()
windowScene?.requestGeometryUpdate(.iOS(interfaceOrientations: .landscape)) { error in
print(error)
print(windowScene?.effectiveGeometry ?? "")
}
}
}else{
UIDevice.current.setValue(UIInterfaceOrientation.landscapeLeft.rawValue, forKey: "orientation")
}