将应用程序转换为 IPAD 时如何保持横向或纵向模式?

Posted

技术标签:

【中文标题】将应用程序转换为 IPAD 时如何保持横向或纵向模式?【英文标题】:How to maintain landscape or portrait mode when converting app to IPAD? 【发布时间】:2019-06-27 06:03:28 【问题描述】:

我目前正在将一个 iphone 应用程序改编为 ipad,并在 viewController 中实现了以下代码,以维护其中一个横向视图(其他视图为纵向):

override func viewDidLoad() 
    super.viewDidLoad()
    collectionView.dataSource = self
    collectionView.delegate = self

    //TODO: - Keep presentationView in landscape

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


override func viewDidDisappear(_ animated: Bool) 
    let value = UIInterfaceOrientation.portrait.rawValue
    UIDevice.current.setValue(value, forKey: "orientation")


override var supportedInterfaceOrientations: UIInterfaceOrientationMask 
    return .landscapeLeft


override var shouldAutorotate: Bool 
    return true

这适用于 iphone,但在 iPad 上显示应用程序时不起作用,即视图旋转并且可以在纵向和横向中看到。感谢任何关于我如何调整代码以使其在 iPad 上工作的建议。

【问题讨论】:

UIDevice.current.setValue(value, forKey: "orientation") 等代码不合适。它不受支持(即使它可能在某些条件下工作)。避免需要使用私有 API 的黑客攻击。 查看这个答案:***.com/questions/28938660/… 感谢您的回复。 Rahul 发布的链接中的以下内容特别有用: - 确保在“目标设置”->“常规”->“部署信息”中选中“需要全屏”。如果未选中,supportedInterfaceOrientationsFor 委托将不会被调用。 - 【参考方案1】:

添加方法 viewWillTransition(to:with:)。 通知容器其视图的大小即将更改。UIKit 在更改呈现的视图控制器视图的大小之前调用此方法。您可以在自己的对象中覆盖此方法,并使用它来执行与大小更改相关的其他任务。

 override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) 
    super.viewWillTransition(to: size, with: coordinator)
    if UIDevice.current.orientation.isLandscape 
        print("Landscape")
        // Update frame
     else 
        print("Portrait")
         // Update frame
    

【讨论】:

以上是关于将应用程序转换为 IPAD 时如何保持横向或纵向模式?的主要内容,如果未能解决你的问题,请参考以下文章

将纵向模式转换为横向模式时的 iPad 设计问题

iPad 应用程序,HTML5,横向和纵向旋转

即使 iPad 处于纵向模式,如何强制 iPad 上的电视处于横向模式

iPad 纵向应用程序以横向模式加载 iAd

将 UIView 坐标从纵向转换为横向,反之亦然

iOS CATiledLayer 崩溃