9

我想在我的 iPAD 应用程序上支持横向和纵向方向,该应用程序使用情节提要,而不涉及Auto LayoutoniOS6+Auto ResizingoniOS 5和更早的复杂性(因为该应用程序将同时支持 iOS 5 和 6,所以AutoLayout这里不允许),我想到了什么作为解决方案的起点如下:

创建两个单独的故事板:MainStoryboard-Portrait& MainStoryboard-Landscape,当当前视图控制器(我们将其命名为 FirstViewController)是纵向的,并且用户将设备旋转到横向时,我从故事板中instantiate新建一个,反之亦然,当用户旋转回纵向时。我在方法中做了这样的事情:FirstViewControllerMainStoryboard-LandscapewillRotateToInterfaceOrientationFirstViewController.m

  UIStoryboard *storyboard  = [UIStoryboard storyboardWithName:@"MainStoryboard-Landscape" bundle:[NSBundle mainBundle]];
  FirstViewController *VC =  [storyboard instantiateViewControllerWithIdentifier:@"VC1"];
  self.view = VC.view;

但是在 iOS6+: 上发生了以下崩溃A view can only be associated with at most one view controller at a time!,在 iOS5 上也尝试过,不会崩溃但旋转无法正常工作:窗口边界旋转但视图本身保持原样。

如何让它在 iOS 5 和 6 上运行?或者如果有其他更好的方法,请为我​​提供一个工作代码示例,我将奖励你 50 分。

4

2 回答 2

8

如果您真的不想使用自动布局,在单个 .storyboard 中执行此操作仍然可以通过使用 anIBOutlet (weak, nonatomic) UIView* portraitView和 an来完成IBOutlet (weak, nonatomic) UIView* landscapeView。将每个视图创建viewFirstViewController.storyboard 中主视图的子视图。

然后在 中willRotateToInterfaceOrientation:,执行以下操作:

    if (UIInterfaceOrientationIsPortrait(toInterfaceOrientation))
    {
        self.portraitView.hidden = NO;
        self.landscapeView.hidden = YES;
    }
    else
    {
        self.portraitView.hidden = YES;
        self.landscapeView.hidden = NO;
    }

在 .storyboard 中处理视图时,您可以通过选中/取消选中hidden右侧边栏中的标志来更好地查看每个子视图。

那么,这样做的另一个优点是,如果您有一些无论方向如何看起来都不错的视图,您不必为它们维护单独的故事板文件和场景。

于 2013-01-02T00:48:39.050 回答
1

自动布局确实是要走的路。一旦你有两个故事板,你就会遇到维护和一致性问题——如果你希望纵向和横向用户体验相同。如果您出于某种原因特别希望它们有所不同,那么两个故事板是合适的。

于 2012-12-30T11:54:55.660 回答