使用故事板支持iPAD上多个方向的最佳方法(无AutoLayout或AutoResizing)

JAH*_*lia 9 xcode objective-c storyboard ipad ios

我希望在我的iPAD应用程序上支持横向和纵向方向,该应用程序使用故事板而不涉及Auto Layouton iOS6+and Auto Resizingon iOS 5和更早的错综复杂(因为该应用程序将同时支持iOS 5和6,因此AutoLayout这里不允许),我想到的作为解决方案的起点如下:

创建两个单独的故事板:MainStoryboard-Portrait&MainStoryboard-Landscape,在当前视图控制器(让我们将其命名为FirstViewController)是在肖像,以及用户旋转设备的风景,我instantiate一个新的FirstViewControllerMainStoryboard-Landscape当用户旋转回纵向故事板,反之亦然.我在willRotateToInterfaceOrientation方法中做了类似的事情FirstViewController.m:

  UIStoryboard *storyboard  = [UIStoryboard storyboardWithName:@"MainStoryboard-Landscape" bundle:[NSBundle mainBundle]];
  FirstViewController *VC =  [storyboard instantiateViewControllerWithIdentifier:@"VC1"];
  self.view = VC.view;
Run Code Online (Sandbox Code Playgroud)

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

如何在iOS 5和6上运行?或者如果还有其他更好的方法,请为我​​提供一份工作代码示例,我将奖励您50分的赏金.

joh*_*doe 8

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

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

    if (UIInterfaceOrientationIsPortrait(toInterfaceOrientation))
    {
        self.portraitView.hidden = NO;
        self.landscapeView.hidden = YES;
    }
    else
    {
        self.portraitView.hidden = YES;
        self.landscapeView.hidden = NO;
    }
Run Code Online (Sandbox Code Playgroud)

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

那么,这样做的另一个好处是,如果你有一些看起来没问题的视图,你就不必为它们维护一个单独的故事板文件和场景.

  • 对于复杂的UI视图来说,它仍然是设计难题+我认为每个场景会同时为两个视图加载两个视图. (2认同)

And*_*rew 1

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

\n

  • 这不是一个好的答案,因为他说他希望能够支持 iOS 6 之前的版本。通过仅支持 iOS 6,您实际上会杀死很大一部分用户群。iOS 6 的采用固然很好,但也不是那么好。 (4认同)