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

使用Swift在一个ViewController中强制横向模式

上官联
2023-03-14

我试图在横向模式下强制应用程序中只有一个视图,我调用:

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

override func supportedInterfaceOrientations() -> Int {
    print("supportedInterfaceOrientations")
    return Int(UIInterfaceOrientationMask.LandscapeLeft.rawValue)
}

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

视图以纵向模式启动,并在更改设备方向时保持旋转。永远不会调用shouldAutorotate()方法。

任何帮助都将不胜感激。

共有3个答案

姜泳
2023-03-14

Swift 4,在iOS 11中测试

您可以在项目目标中指定方向-

AppDelegate

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

LandScpaeViewController

override func viewDidLoad() {
        super.viewDidLoad()
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        appDelegate.myOrientation = .landscape
}

点击按钮

let appDelegate = UIApplication.shared.delegate as! AppDelegate
 appDelegate.myOrientation = .portrait

就是这样。:)

胡星汉
2023-03-14
override func viewDidLoad() {
    super.viewDidLoad()
    let value = UIInterfaceOrientation.landscapeLeft.rawValue
    UIDevice.current.setValue(value, forKey: "orientation")
}

override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return .landscapeLeft
}

override var shouldAutorotate: Bool {
    return true
}

如果您的视图嵌入到导航控制器中,那么仅上述操作是行不通的。您必须在类定义之后通过以下扩展进行级联。

extension UINavigationController {

override open var shouldAutorotate: Bool {
    get {
        if let visibleVC = visibleViewController {
            return visibleVC.shouldAutorotate
        }
        return super.shouldAutorotate
    }
}

override open var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation{
    get {
        if let visibleVC = visibleViewController {
            return visibleVC.preferredInterfaceOrientationForPresentation
        }
        return super.preferredInterfaceOrientationForPresentation
    }
}

override open var supportedInterfaceOrientations: UIInterfaceOrientationMask{
    get {
        if let visibleVC = visibleViewController {
            return visibleVC.supportedInterfaceOrientations
        }
        return super.supportedInterfaceOrientations
    }
}}
override func viewDidLoad() {
    super.viewDidLoad()
    let value = UIInterfaceOrientation.landscapeLeft.rawValue
    UIDevice.current.setValue(value, forKey: "orientation")
}

private func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
    return UIInterfaceOrientationMask.landscapeLeft
}

private func shouldAutorotate() -> Bool {
    return true
}
颜畅
2023-03-14

这可能对其他人有用,我找到了一种强制以横向模式启动视图的方法:

把这个放在viewddLoad()中:

let value = UIInterfaceOrientation.landscapeLeft.rawValue
UIDevice.current.setValue(value, forKey: "orientation")

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

  • 我在纵向模式下有十多个ViewController,但无论设备的方向如何,我都需要在横向模式下强制一个ViewController。

  • 问题内容: 我试图对我的应用程序强制使用“横向”模式,因为我的应用程序绝对不是针对“人像”模式设计的。我怎样才能做到这一点? 问题答案: 现在可以使用HTML5 Webapp清单。 见下文。 原始答案: 您不能将网站或Web应用程序锁定在特定方向。它违反了设备的自然行为。 您可以使用CSS3媒体查询来 检测 设备方向,如下所示: 或通过绑定JavaScript方向更改事件,如下所示: 2014年1

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

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

  • 好的,我有一个视图控制器,它是一个AVPlayer。我希望这个控制器能够旋转到横向模式并自由肖像 当我关闭屏幕时,我仍然需要以前的控制器处于纵向。这应该不是问题,因为竖屏被锁定为我设置中的唯一方向,我想保持这种状态。但是我希望这个屏幕能够自由移动。任何想法和提示都将不胜感激。 app delegate方法对我无效。重写也不应在函数中自动旋转或支持InterfaceOrientations