【问题标题】:Storyboards + Size Classes: How to implement different Segues, ViewControllers, UserFlow for different devices / size classes?Storyboards + Size Classes:如何为不同的设备/尺寸类实现不同的Segues、ViewControllers、UserFlow?
【发布时间】:2015-11-12 13:25:20
【问题描述】:

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

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

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

这只是一个区别,但还有其他区别。应该如何在一个 Storyboard 中处理这些差异?为了实现这一点,我必须根据当前的 Size Class 指定不同的 segue。但据我所知这是不可能的。

一些新的 iOS 8 自适应 Segue 的 行为 会因大小类而异,但据我所知,无法为不同的大小类指定不同的 segue。此外,无法根据 Size Class 定义不同的初始 ViewController。

所以问题是:是否可以在一个 Storyboard 中指定两种不同的布局(包括不同的 Segue、ViewController 等)?

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

【问题讨论】:

    标签: ios iphone ipad uiviewcontroller size-classes


    【解决方案1】:

    我刚刚经历了类似的痛苦,发现处理较大差异的唯一真正方法是像往常一样在情节提要中创建单独的控制器和转场,但要在代码中执行它们而不是依赖情节提要中创建的转场激活.

    在我的例子中,我在 iPhone 和 iPad 上都使用了侧边菜单,但在 iPad 上,主显示使用拆分视图控制器,而不是 iPhone 上的 UINavigationController。一个额外的复杂情况是,在 iOS8 上,iPhone 支持 UISplitViewController,但在 iOS7 上不支持,它被视为 UINavigationController。

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

    您最大的问题将是 iOS9 分屏,它似乎会在您滑动时将尺寸等级从 iPad 常规W/常规H 动态更改为 iPad 紧凑W/常规H 并返回。你可以接受像拆分视图这样的东西,它会简单地切换到看起来像一个导航控制器堆栈。我看不出有什么办法可以即时切换到选项卡栏,除非您弹回根目录,让应用程序委托切换根屏幕并将您导航回同一个地方。很大程度上取决于您希望在这种情况下发生什么。

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

    0) 在 App 委托中,计算设备类型并将根屏幕设置为正确的故事板控制器入口点:例如ipad 上的拆分视图,iPhone 上的标签视图。向应用程序委托添加一些方法/属性以便任何控制器访问以找出当前运行模式是很方便的。当您需要决定触发哪个 segue 时,这将使您的生活更轻松。

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

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

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

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

    5) 对于在拆分视图控制器中用作详细视图的 UIViewController,但在弹出框或 iOS7 上的 iPhone 上使用时可能还需要推送,请从它们各自的主详细信息控制器创建推送序列。仅当您通过弹出框呈现在拆分视图中设计的每个内容时,或者在 iPhone 上没有拆分视图的 iOS7 上时,您才需要此选项。

    6) 在控制器之间创建转场,包括 iPad/iPhone 特定转场。如果只有一种可能的转场,您可以使用情节提要激活。否则,只需在控制器本身之间绘制 segues。

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

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

    这些都不是特别漂亮,但它似乎是必要的邪恶,特别是如果您使用拆分视图控制器和弹出框。好处是您至少可以在一个地方看到所有内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-08
      • 2018-06-11
      • 2015-02-24
      • 2015-04-14
      • 2017-01-21
      • 1970-01-01
      • 2013-10-23
      • 1970-01-01
      相关资源
      最近更新 更多