故事板+大小类:如何为不同的设备/大小类实现不同的Segues,ViewControllers,UserFlow?

时间:2015-08-19 09:55:00

标签: ios iphone ipad uiviewcontroller size-classes

现有的iOS 7+应用程序支持iPhone和iPad。目前我使用两种不同的故事板进行iPhone和iPad布局,效果很好。现在我尝试使用自适应大小类将其转换为One-Storyboard-Layout。

我的问题是,我的iPhone和iPad布局完全不同。它们不仅为控件使用不同的大小和位置,还使用一些完全不同的视图控制器。

两个故事板都使用MMDrawerController作为初始VC。但是从那里开始,控制流程就不同了。虽然 iPad 故事板使用UISplitViewController作为所有其他ViewControllers的基础,但 iPhone 使用UITabBarViewController代替。

这只是一个区别,但还有其他区别。如何在一个故事板中处理这些差异?为了达到这个目的,我将根据当前的Size Class来定义不同的segue。但据我所知,这是不可能的。

一些新的iOS 8自适应Segues可以表现,具体取决于Size Class,但据我所知,不可能为不同的Size Classes指定不同的segue。此外,根据Size Class,无法定义不同的初始ViewControllers。

所以问题是:是否可以在一个故事板中指定两种不同的布局(包括不同的Segues,ViewControllers等)?

切换到单个Storyboard的原因是支持iOS 9中的新分屏和幻灯片功能。在启动时根据屏幕大小/大小类加载不同的故事板很容易。但是,当动态更改大小类时,无法在运行时切换到另一个Storyboard。是吗?

1 个答案:

答案 0 :(得分:4)

我刚刚经历过类似的痛苦,并发现处理更大差异的唯一真正方法是在故事板中正常创建单独的控制器和segue,但是在代码中执行它们而不是依赖于在storyboard中创建的segue激活

在我的情况下,我在iPhone和iPad上使用侧面菜单,但在iPad上使用分割视图控制器作为主显示器而不是iPhone上的UINavigationController。更复杂的是,在iOS8上,UISplitViewController在iPhone上受支持,但在iOS7上则不受支持,因为它被视为UINavigationController。

据我所知,你不能使用size类自动触发正确类型的segue。但是,只要您有一个进行选择的机制,您就可以在代码中执行此操作。因此,您仍然可以为每个大小的类创建segue,或者更好地为给定的设备类型创建显示模式,并从代码中调用正确的。

你最大的问题将是iOS9分屏,它似乎会动态地将尺寸级别从iPad regularW / regularH改为iPad compactW / regularH,然后再滑动。您可以选择拆分视图,只需切换到导航控制器堆栈即可。我可以看到没有办法切换到标签栏,除非你弹回根,让app委托切换根屏幕并导航回到同一个地方。在这种情况下,很大程度上取决于您希望看到的内容。

最后,我在故事板中的一般经验法则是:

0)在App委托中,计算设备类型并将根屏幕设置为正确的故事板控制器入口点:例如在ipad上拆分视图,在iPhone上的选项卡视图。将任何方法/属性添加到app委托以便任何控制器访问以找出当前运行模式是很方便的。当你需要决定开火时,这将使生活更轻松。

1)根据需要创建单独的控制器,并始终使用Any / Any尺寸类设计视图来创建大部分设计。我开始使用不同的设计视图,但发现管理起来太棘手了。特别是因为一些控制器可能出现在弹出窗口上,其中iPad上的尺寸等级(紧凑宽度)与主屏幕上的尺寸等级(常规宽度)不同。

2)根据需要对各个约束,字体等使用大小等级调整。

3)对于任何可能出现在弹出窗口中的视图控制器,在它前面加上一个UINavigationController,其故事板ID可用作任何弹出窗口的根目录。

4)对于UISplitViewControllers,使用showDetail样式segues正常创建。

5)对于在分割视图控制器中用作详细视图的UIViewControllers,但在弹出时或iOS7上的iPhone上使用时也可能需要将其推入,请从各自的主细节控制器创建推送segue。如果您通过弹出窗口在拆分视图中设置的每个现有内容,或者在iPhone上没有拆分视图的iOS7上,您只需要这个。

6)在控制器之间创建segue,包括iPad / iPhone特定的segues。如果只有一个可能的segue,您可以使用storyboard激活。否则只需在控制器之间绘制segues。

7)对于按钮或单元格触发segues的任何控制器,您可以添加目标操作而不是segue触发器。在这些操作中,您将手动调用相应的segue。

8)在每个视图控制器中,目标控制器类型取决于显示模式的类型,编写代码,使用您的app委托运行模式属性来决定使用哪个segue,然后调用peformSegueWithIdentifier与segue的标识符。

非此特别漂亮,但它似乎是一个必要的邪恶,特别是如果你使用拆分视图控制器和弹出窗口。好消息是你至少可以在一个地方看到所有东西。