支持 Landscape Orientation 的 UiViewController 将其他 Views 放入 Landscape

Posted

技术标签:

【中文标题】支持 Landscape Orientation 的 UiViewController 将其他 Views 放入 Landscape【英文标题】:UiViewController which supports Landscape Orientation puts other Views in Landscape 【发布时间】:2019-11-26 15:58:30 【问题描述】:

我现在搜索了一天,没有找到合适的解决方案。 我的应用程序由内部的标签栏控制器和导航控制器组成。 我只希望所有屏幕都是纵向的,但只有一个子视图是横向的。

它可以到达那里,但是当我从子视图返回时,物理上保持横向,尽管我只允许 .portrait ind 控制器,但父视图也显示为横向。

我已经这样做了:

extension UITabBarController 
   override open var shouldAutorotate: Bool 
      get 
          if let visibleVC = selectedViewController 
              return visibleVC.shouldAutorotate
          
          return super.shouldAutorotate
      
   

   override open var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation
       get 
           if let visibleVC = selectedViewController 
               return visibleVC.preferredInterfaceOrientationForPresentation
           
           return super.preferredInterfaceOrientationForPresentation
       
   

   override open var supportedInterfaceOrientations: UIInterfaceOrientationMask 
      // your custom logic for rotation of selected tab
         get 
               if let visibleVC = selectedViewController 
                   return visibleVC.supportedInterfaceOrientations
               
               return super.supportedInterfaceOrientations
           
   


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 var shouldAutorotate: Bool
      return true
   

   override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation
        return .portrait
   

   override var supportedInterfaceOrientations: UIInterfaceOrientationMask
      return .portrait
   

当我将设备转到纵向时,视图再次以纵向显示,但我希望在孩子以横向方式解雇后立即发生这种情况,即使我不转动设备。

有什么想法吗? 谢谢!

【问题讨论】:

【参考方案1】:

在您的横向视图控制器中添加此代码

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

和 ViewWillDisappear 添加这个

override func viewWillDisappear(_ animated: Bool) 
    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    appDelegate.myOrientation = .portrait
    UIView.setAnimationsEnabled(false)
    UIDevice.current.setValue(UIInterfaceOrientation.portrait.rawValue, forKey: "orientation")
    UIView.setAnimationsEnabled(true)
    UIViewController.attemptRotationToDeviceOrientation()
    UIView.setAnimationsEnabled(false)

在 appDeledate 添加这一行

var window: UIWindow?
var myOrientation: UIInterfaceOrientationMask = .portrait

【讨论】:

非常感谢!你的提议很有效!再次感谢。

以上是关于支持 Landscape Orientation 的 UiViewController 将其他 Views 放入 Landscape的主要内容,如果未能解决你的问题,请参考以下文章

通过代码设置 为横屏

CSS Media Query Landscape - 键盘问题

在 Flutter Widget 测试中,如何将 media.orientation 设置为纵向?

关于iOS中支持屏幕取向的讲解

横竖屏样式

Android 在运行时确定屏幕方向