iOS 16阻止UIViewController旋转

umuewwlo  于 2022-11-26  发布在  iOS
关注(0)|答案(2)|浏览(505)

我有一个UIViewController,它支持所有的UIInterfaceOrientationMasks,但是,在一个特定的情况下,我需要防止它旋转。在iOS 16之前,我只是这样处理这种情况

override var shouldAutorotate: Bool {
    return !screenRecorderIsActive
}

一切都很好更新到iOS 16后,我的控制器一直在旋转,我找不到一种方法来修复它

rsaldnfx

rsaldnfx1#

引自iOS 16 release notes
[UIViewController shouldAutorotate]已过时,不再支持。[UIViewController attemptRotationToDeviceOrientation]已过时,并替换为[UIViewController setNeedsUpdateOfSupportedInterfaceOrientations]。

解决方法:依赖shouldAutorate的应用应使用视图控制器supportedInterfaceOrientations反映其首选项。如果支持的方向发生更改,请使用'-[UIViewController setNeedsUpdateOfSupportedInterface

要实现动态支持的接口方向,可以使用如下代码:

var screenRecorderIsActive: Bool {
    didSet {
        setNeedsUpdateOfSupportedInterfaceOrientations()
    }
}

override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    if screenRecorderIsActive {
        return [.landscape] // For example, or a variable representing the orientation when the condition was set
    }
    return [.all]
}
anhgbhbe

anhgbhbe2#

在我的例子中,我需要阻止自动旋转不是基于特定的方向,而是基于你在应用程序中做什么以及你的设备有什么样的硬件。而且,我需要继续支持iOS版本,一直到9.3。这些更新迫使我做了以下几件事:
这些新功能在9.3版本中是不可用的,所以我必须检查一下iOS的版本是否是16.x。如果是的话,那么我必须实现supportedInterfaceOrientations,以便查询当前用户界面的方向,并且只有在请求的方向与当前用户界面的方向相同时才返回TRUE。换句话说,不允许更改。
此外,由于从后台返回或来自其他视图控制器的旋转或事件都可以更改我的逻辑选择,以确定允许哪些方向,因此我必须确保在从后台返回时或需要防止自动旋转的任何其他时间调用setNeedsUpdateOfSupportedInterfaceOrientations方法。
同样,我不得不将这段代码 Package 在iOS版本检查中。最后,我不得不用旧版本iOS的老方法来实现东西。
我对这种突破性的改变感到非常失望。是的,这些方法被弃用了很长一段时间,但新方法直到16.0才被引入--更关键的是,我的代码在使用iPad 10上的前置横向摄像头时做了不同的事情,所以我不得不等到我手中有了一个单元才发现这些问题。

相关问题