在运行时更改方向更改 ViewControllers

Posted

技术标签:

【中文标题】在运行时更改方向更改 ViewControllers【英文标题】:Change ViewControllers on Orientation change in runtime 【发布时间】:2013-12-08 11:32:31 【问题描述】:

我想更改屏幕上的 ViewControllers 方向更改

我只有一个类 ViewController 和两个 StoryboardBased UIViewControllers。

  UIDeviceOrientation orientation = [UIDevice currentDevice].orientation;
    if (orientation == UIDeviceOrientationPortrait || orientation == UIDeviceOrientationPortraitUpsideDown)
    
        [[NSBundle mainBundle] loadNibNamed:@"Portrait" owner:self options:nil];
    
    else 
        [[NSBundle mainBundle] loadNibNamed:@"Landscape" owner:self options:nil];
    

此代码可用于在方向更改时加载不同的 xib。但是如何在方向改变时在 Xib 文件中加载不同的控制器?

【问题讨论】:

【参考方案1】:

你可以这样做

   - (void)viewDidLoad
     
          [[NSNotificationCenter defaultCenter] addObserver:self  selector:@selector(orientationChanged:)  name:UIDeviceOrientationDidChangeNotification  object:nil];   
     

     -(void)orientationChanged:(NSNotification *)notification
      
           UIInterfaceOrientation toInterfaceOrientation = [[UIApplication sharedApplication] statusBarOrientation];

           if (UIInterfaceOrientationIsPortrait(toInterfaceOrientation))
           
                [[NSBundle mainBundle] loadNibNamed:@"Portrait" owner:self options:nil];            
           
           else if (UIInterfaceOrientationIsLandscape(toInterfaceOrientation))
           
                [[NSBundle mainBundle] loadNibNamed:@"Landscape" owner:self options:nil];
           
      

希望对你有所帮助......

【讨论】:

【参考方案2】:

当您采用这种方法时,您不会在 xib 中加载不同的视图控制器。一个 xib 代表一个视图及其子视图。

但是,我会采用另一种方法。我将创建一个视图 A(“主机”视图控制器的 self.view),它只有两个全屏容器视图,一个用于横向,一个用于纵向。 只需使两者都自动调整大小,以便它们始终占据全屏。

在轮换事件时,我应该相应地隐藏和取消隐藏它们。

但是为什么您认为每次旋转都需要单独的视图控制器?

【讨论】:

那动画呢,会不会很奇怪? 您可以为隐藏和取消隐藏设置动画。你试过了吗?【参考方案3】:

这里最好的方法可能是使用view controller containment api。你应该做的是有一个包装视图控制器,它嵌入来自 2 个视图控制器的两个视图(每个方向一个),并使用 ios API 提供的方法 respond to orientation change 在视图之间切换

【讨论】:

以上是关于在运行时更改方向更改 ViewControllers的主要内容,如果未能解决你的问题,请参考以下文章

iOS ViewController 在方向更改后无法正确布局

在实例化 ViewController 之前更改/修改运行时用户定义的属性

iiview 甲板控制器在呈现模态视图时更改框架而不更改界面方向

在不继承 UINavigationController 的情况下以编程方式更改 ViewController 的方向

更改父视图控制器的界面方向

更改方向IOS后视图边界不更新