当前位置: 首页 > 知识库问答 >
问题:

仅在一个ViewController中旋转

邹斌
2023-03-14

我试图旋转一个视图,而所有其他视图(5)都固定为纵向。原因是,在这一视图中,我希望用户观看他之前保存的图片。我想这是可能的,但到目前为止我还不知道如何做到这一点。有谁能帮我或给我一个提示吗?我正在用iOS8上的Swift进行编程

共有3个答案

万嘉熙
2023-03-14

有时,当您使用自定义导航流(可能会变得非常复杂)时,上述解决方案可能并不总是有效。此外,如果您有几个需要支持多个方向的ViewController,它可能会变得非常乏味。

这是我找到的一个相当快速的解决方案。定义一个类OrientationManager并使用它来更新AppServer中支持的方向:

class OrientationManager {
    static var landscapeSupported: Bool = false
}

然后将您想要的特定情况下的方向:

func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
        if OrientationManager.landscapeSupported {
            return .allButUpsideDown
        }
        return .portrait
    }

然后,在要进行多个导航的视图控制器中,更新方向管理器:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    OrientationManager.landscapeSupported = true
}

此外,在退出此ViewController时,不要忘记再次更新它:

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    OrientationManager.landscapeSupported = false
    //The code below will automatically rotate your device's orientation when you exit this ViewController
    let orientationValue = UIInterfaceOrientation.portrait.rawValue
    UIDevice.current.setValue(orientationValue, forKey: "orientation")
}

希望这有帮助!

更新:

您可能只想将静态func添加到您的方向支持管理器类:

    static func setOrientation(_ orientation: UIInterfaceOrientation) {
        let orientationValue = orientation.rawValue
        UIDevice.current.setValue(orientationValue, forKey: "orientation")
        landscapeSupported = orientation.isLandscape
    }

然后,您可以在需要将方向设置回纵向时调用此函数。这也将更新静态的landscapeSupported值:

OSM.setOrientation(.portrait)
谢洛城
2023-03-14

您也可以以面向协议的方式执行此操作。只需创建协议

protocol CanRotate {

}

以更“迅速”的方式在AppServer ate中添加相同的2个方法

func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
    if topViewController(in: window?.rootViewController) is CanRotate {
        return .allButUpsideDown
    } else {
        return .portrait
    }
}


func topViewController(in rootViewController: UIViewController?) -> UIViewController? {
    guard let rootViewController = rootViewController else {
        return nil
    }

    if let tabBarController = rootViewController as? UITabBarController {
        return topViewController(in: tabBarController.selectedViewController)
    } else if let navigationController = rootViewController as? UINavigationController {
        return topViewController(in: navigationController.visibleViewController)
    } else if let presentedViewController = rootViewController.presentedViewController {
        return topViewController(in: presentedViewController)
    }
    return rootViewController
}

在每个需要不同行为的ViewController中,只需在类的定义中添加协议名称。

class ViewController: UIViewController, CanRotate {}

如果需要任何特定的组合,可以向协议中添加一个变量以覆盖

protocol CanRotate {
    var supportedInterfaceOrientations: UIInterfaceOrientationMask
}
公孙和怡
2023-03-14

我建议在您的appDelegate中使用SupportedInterfaceDirectionsforWindow,以仅允许在特定视图控制器中旋转,例如:

Swift 4/Swift 5

func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {

    // Make sure the root controller has been set
    // (won't initially be set when the app is launched)
    if let navigationController = self.window?.rootViewController as? UINavigationController {

        // If the visible view controller is the
        // view controller you'd like to rotate, allow
        // that window to support all orientations
        if navigationController.visibleViewController is SpecificViewController {
            return UIInterfaceOrientationMask.all
        } 

        // Else only allow the window to support portrait orientation
        else {
            return UIInterfaceOrientationMask.portrait
        }
    }

    // If the root view controller hasn't been set yet, just
    // return anything
    return UIInterfaceOrientationMask.portrait
}

请注意,如果在转到纵向屏幕之前,SpecificViewController处于横向,则另一个视图仍将在横向中打开。为了避免这种情况,我建议在视图处于横向时不允许过渡。

雨燕3

func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow?) -> Int {

    // Make sure the root controller has been set
    // (won't initially be set when the app is launched)
    if let navigationController = self.window?.rootViewController as? UINavigationController {

        // If the visible view controller is the
        // view controller you'd like to rotate, allow
        // that window to support all orientations
        if navigationController.visibleViewController is SpecificViewController  {
            return Int(UIInterfaceOrientationMask.All.rawValue)
        }

        // Else only allow the window to support portrait orientation
        else {
            return Int(UIInterfaceOrientationMask.Portrait.rawValue)
        }
    }

    // If the root view controller hasn't been set yet, just
    // return anything
    return Int(UIInterfaceOrientationMask.Portrait.rawValue)
}
 类似资料:
  • 问题内容: 我正在尝试旋转一个视图,而所有其他视图(5)都固定为纵向。原因是在该视图中,我希望用户观看以前保存的图片。我想这是可能的,但到目前为止我还不知道如何实现。谁能帮忙或给我提示吗?我正在在iOS8上运行的Swift中编程 问题答案: 这是针对 Swift 3和Swift 4的 。您可以在AppDelegate.swift中使用以下代码: 您可以在原始帖子中了解更多信息:http : //w

  • 问题内容: 我刚开始使用快速语言,并且知道这个问题是重复的。我发现了几个类似的问题和答案,但我无法弄清这个问题。 我想将ScandString变量的值从ScanViewController传递给ResultViewController。 ScanViewcontroller如下: ResultViewController如下: println(detectedString)没有给我任何结果。问题是

  • 问题内容: 我有以下内容: 我如何从另一个ViewController 访问? 我需要访问此功能: 问题答案: 默认情况下,swift中的所有内容都是公开的,因此,如果您声明以下内容: 只要拥有它的实例,就可以访问它:

  • 问题内容: 问题 我开始浏览上的新功能,并尝试了一些演示项目和教程。现在我被困在: 实例化,然后呈现特定情节提要中的 Objective-C解决方案 如何在Swift上实现这一目标? 问题答案: 这个答案最近针对Swift 5.2和iOS 13.4 SDK进行了修订。 这都是新语法和稍微修改的API的问题。UIKit的基本功能没有改变。对于绝大多数iOS SDK框架来说都是如此。 如果您遇到问题,

  • 我有一个自定义的,我希望将作为从一传递到二(这是模态)。问题是,当我使用在之间切换时,函数不会被触发,因为处理我假设的转换。 那我该怎么做呢?如何将从一个传递到下一个。

  • 问题内容: 我试图在横向模式下仅强制应用程序中的一个视图, 该视图以纵向模式启动,并且在更改设备方向时保持旋转。 从不调用shouldAutorotate。 任何帮助,将不胜感激。 问题答案: 它对其他人可能有用,我找到了一种强制视图以横向模式启动的方法: 把它放在viewDidLoad()中: 和,