gpt4 book ai didi

ios - 如何只为一个 View Controller 锁定方向?

转载 作者:搜寻专家 更新时间:2023-11-01 05:46:08 25 4
gpt4 key购买 nike

我可以只在一个 Controller 中设置纵向和锁定方向吗?

我试过:

override func supportedInterfaceOrientations() -> Int {
return Int(UIInterfaceOrientationMask.Portrait.rawValue)
}

override func shouldAutorotate() -> Bool{
return false
}

但这对我没有帮助。我还必须添加其他内容吗?

最佳答案

这段代码应该可以工作:

    override func supportedInterfaceOrientations() -> Int {
return Int(UIInterfaceOrientationMask.Portrait.rawValue)
}

override func shouldAutorotate() -> Bool{
return false
}

override func preferredInterfaceOrientationForPresentation() -> UIInterfaceOrientation {
return UIInterfaceOrientation.Portrait
}

如果它现在为您工作,那么我想您的 Controller 位于另一个 Controller (UINavigationControllerUITabBarControllerUISplitViewController)中。在这种情况下,您需要在该父 Controller 中使用此代码。

如果您的导航 Controller 包含多个 View Controller ,并且您只需要为其中的一些 View Controller 禁用方向,那么您需要继承 UINavigationController 类并在其中编写如下内容:

class NavigationController: UINavigationController {

var shouldRotate: Bool = true

override func supportedInterfaceOrientations() -> Int {
return shouldRotate ? Int(UIInterfaceOrientationMask.Portrait.rawValue) : Int(UIInterfaceOrientationMask.All.rawValue)
}

override func shouldAutorotate() -> Bool{
return shouldRotate
}
}

然后在您需要禁用方向的 Controller 中,您可以为导航 Controller 禁用它:

class ViewController: UIViewController {

var lastControllerRotationStatus: Bool?

override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)

if let navigationController = self.navigationController as? NavigationController {
lastControllerRotationStatus = navigationController.shouldRotate
navigationController.shouldRotate = false
}
}

override func viewDidDisappear(animated: Bool) {
super.viewDidDisappear(animated)

if let navigationController = self.navigationController as? NavigationController {
navigationController.shouldRotate = lastControllerRotationStatus ?? true
}
}
}

但请记住,在您的 Controller 被推出导航 Controller 后,您需要恢复旧的旋转状态。在此示例中,我在更改旋转状态之前保存旋转状态,并在 Controller 消失后恢复它。您也可以使用其他一些方法。例如,您可以重载 UINavigationController 方法 popViewController,并将 shouldRotate 设置为 false。

与 Controller 变量设置相同的方法,您可以使用 AppDelegate 方法控制旋转 application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow) -> Int

那么就不需要继承navigation controller了。

您的 AppDelegate 类代码如下所示:

class AppDelegate: UIResponder, UIApplicationDelegate {

var window: UIWindow?

var shouldRotate = true
func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow?) -> Int {

return shouldRotate ? Int(UIInterfaceOrientationMask.All.rawValue) : Int(UIInterfaceOrientationMask.Portrait.rawValue)

}

}

您的 Controller 代码将如下所示:

class ViewController: UIViewController {

var lastControllerRotationStatus: Bool?

override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)

if let appDelegate = UIApplication.sharedApplication().delegate as? AppDelegate {
lastControllerRotationStatus = appDelegate.shouldRotate
appDelegate.shouldRotate = false
}
}

override func viewDidDisappear(animated: Bool) {
super.viewDidDisappear(animated)

if let appDelegate = UIApplication.sharedApplication().delegate as? AppDelegate {
appDelegate.shouldRotate = lastControllerRotationStatus ?? true
}
}
}

关于ios - 如何只为一个 View Controller 锁定方向?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29950456/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com