swift Force View控制器方向是否在iOS 16测试版中正常工作

wqnecbli  于 2022-10-31  发布在  Swift
关注(0)|答案(8)|浏览(146)

根据iOS & iPadOS 16 Beta 3发行说明:-尝试通过setValue:forKey:UIDevice上设置方向不受支持,也不再起作用。相反,他们建议用途:首选的演示界面方向。
在我的例子中,无论是使用preferredInterfaceOrientationForPresentation还是requestGeometryUpdate,强制视图控制器方向在iOS 16测试版中都不起作用。
以前,UIDevice.current.setValue(UIInterfaceOrientation.landscapeLeft.rawValue, forKey: "orientation")工作正常。

1cosmwyk

1cosmwyk1#

我在下面代码中遇到的问题是,我试图在关闭模态视图时执行此操作,但其下的视图更新不够快。如果我将requestGeometryUpdate放在一个单独的按钮上,那么当我关闭视图时,它将工作。

if #available(iOS 16.0, *) {

    let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene

    windowScene?.requestGeometryUpdate(.iOS(interfaceOrientations: .portrait))

}
b4lqfgs4

b4lqfgs42#

对我有用。
在应用程序委派中,

var orientation: UIInterfaceOrientationMask = .portrait
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
        return orientation
    }

在视图控制器中,

(UIApplication.shared.delegate as? AppDelegate)?.orientation = .landscapeRight

let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene
windowScene?.requestGeometryUpdate(.iOS(interfaceOrientations: .landscapeRight))

UIApplication.navigationTopViewController()?.setNeedsUpdateOfSupportedInterfaceOrientations()

在帮助程序中,

extension UIApplication {
    class func navigationTopViewController() -> UIViewController? {
            let nav = UIApplication.shared.keyWindow?.rootViewController as? UINavigationController
            return  nav?.topViewController
        }
}
niknxzdl

niknxzdl3#

我注意到我的问题似乎可以通过调用下面的方法解决:
[UIView控制器设置需要更新支持的接口
你可以给予看。

zrfyljdw

zrfyljdw4#

setValue:forKey是旧的NSObjectNSKeyValueCoding)的一个方法。它没有正式的文档记录,也没有得到UIDevice类的支持。使用它是考虑使用一个私有的api。苹果可以随时终止它。

j2qf4p5b

j2qf4p5b5#

苹果发布了新的API,替换为setValue:forKey:“orientation”。Apple update

guard let windowScene = view.window?.windowScene else { return }
windowScene.requestGeometryUpdate(.iOS(interfaceOrientations: .landscape)) { error in
// Handle denial of request.
}

但是我有关于UIDevice.orientationDidChangeNotification的问题,它不工作

xggvc2p6

xggvc2p66#

这对我很有效

import Foundation
    import UIKit

    extension UIViewController {

    func setDeviceOrientation(orientation: UIInterfaceOrientationMask) {
        if #available(iOS 16.0, *) {
            let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene
            windowScene?.requestGeometryUpdate(.iOS(interfaceOrientations: orientation))
        } else {
            UIDevice.current.setValue(orientation.toUIInterfaceOrientation.rawValue, forKey: "orientation")
        }
    }
}

extension UIInterfaceOrientationMask {
    var toUIInterfaceOrientation: UIInterfaceOrientation {
        switch self {
        case .portrait:
            return UIInterfaceOrientation.portrait
        case .portraitUpsideDown:
            return UIInterfaceOrientation.portraitUpsideDown
        case .landscapeRight:
            return UIInterfaceOrientation.landscapeRight
        case .landscapeLeft:
            return UIInterfaceOrientation.landscapeLeft
        default:
            return UIInterfaceOrientation.unknown
        }
    }
}

如何使用

只需在您的UIViewController上调用它:

setDeviceOrientation(orientation: .landscapeRight)
2guxujil

2guxujil7#

按照Apple的文档,您需要
请求使用指定的几何体首选项对象更新窗口场景的几何体。
https://developer.apple.com/documentation/uikit/uiwindowscene/3975944-requestgeometryupdate/
因此,使用示例中的代码,您可以使用requestGeometryUpdatesetNeedsUpdateOFSupportedInterface更改我们在视图中设置方向的方式

public extension UIViewController {

func deviceOrientation(orientation: UIInterfaceOrientationMask) {
    if #available(iOS 16.0, *) {
        guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene
        else { return }
        windowScene.requestGeometryUpdate(.iOS(interfaceOrientations: orientation))
        self.setNeedsUpdateOfSupportedInterfaceOrientations()
    }
  }
}
5sxhfpxr

5sxhfpxr8#

我尝试了以上所有的解决方案,似乎他们不是100%的工作。通过这篇文章https://developer.apple.com/forums/thread/707735后,我得到了提示。让我们试试下面的代码。它为我工作。

if #available(iOS 16.0, *) {
        DispatchQueue.main.async {
            UIViewController.attemptRotationToDeviceOrientation()

            let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene
                windowScene?.requestGeometryUpdate(.iOS(interfaceOrientations: orientation)) { error in
                print(error)
                print(windowScene?.effectiveGeometry)
            }
               navigationController?.topViewController?.setNeedsUpdateOfSupportedInterfaceOrientations()
        }
   }

相关问题