And*_*ord 7 iphone uiviewcontroller ipad ios size-classes
现有的iOS 7+应用程序支持iPhone和iPad.目前我使用两种不同的故事板进行iPhone和iPad布局,效果很好.现在我尝试使用自适应大小类将其转换为One-Storyboard-Layout.
我的问题是,我的iPhone和iPad布局完全不同.它们不仅为控件使用不同的大小和位置,还使用一些完全不同的视图控制器.
两个故事板都使用MMDrawerController初始VC.但是从那里开始,控制流程就不同了.虽然iPad Storyboard使用了UISplitViewController所有其他ViewControllers的基础,但iPhone却使用了它UITabBarViewController.
这只是一个区别,但还有其他一些.如何在一个故事板中处理这些差异?为了达到这个目的,我将根据当前的Size Class来定义不同的segue.但据我所知,这是不可能的.
一些新的iOS 8自适应Segues的行为可能会有所不同,具体取决于Size Class,但据我所知,不可能为不同的Size Classes指定不同的segue.此外,根据Size Class,无法定义不同的初始ViewControllers.
所以问题是:是否可以在一个故事板中指定两种不同的布局(包括不同的Segues,ViewControllers等)?
切换到单个Storyboard的原因是支持iOS 9中的新分屏和幻灯片功能.在启动时加载不同的故事板取决于屏幕大小/大小类很容易.但是,当动态更改大小类时,无法在运行时切换到另一个Storyboard.是吗?
我刚刚经历了类似的痛苦,发现处理较大差异的唯一真正方法是像平常一样在故事板中创建单独的控制器和segue,但在代码中执行它们而不是依赖于故事板中创建的segue激活。
就我而言,我在 iPhone 和 iPad 上都使用了侧边菜单,但在 iPad 上使用分割视图控制器作为主显示屏,而 iPhone 上则使用 UINavigationController。更复杂的是,在 iOS8 上,iPhone 支持 UISplitViewController,但在 iOS7 上不支持,在 iOS7 上它被视为 UINavigationController。
据我所知,您不能使用 size class 自动触发正确类型的 segue。但是,只要您有一种做出选择的机制,您就可以在代码中做到这一点。因此,您仍然可以为每个尺寸类别创建 Segue,或者为给定的设备类型改进显示模式,并从代码中调用正确的模式。
您最大的问题将是 iOS9 分屏,它似乎会在您滑动时动态更改尺寸类别,从 iPad 常规 W/常规 H 更改为 iPad 紧凑 W/常规 H 并返回。您可以使用诸如分割视图之类的东西,这些视图将简单地切换为看起来像导航控制器堆栈。我看不出有什么办法可以即时切换到选项卡栏,除非您弹回根目录,让应用程序委托切换根屏幕并将您导航回同一位置。很大程度上取决于您希望在这种情况下发生什么。
最后,我在故事板中的一般经验法则是:
0) 在应用程序委托中,计算出设备类型并将根屏幕设置为正确的故事板控制器入口点:例如,ipad 上的分割视图、iPhone 上的选项卡视图。可以很方便地向应用程序委托添加一些方法/属性,以便任何控制器访问以了解当前的运行模式。当您需要决定触发哪一个 Segue 时,这将使您的生活变得更轻松。
1) 根据需要创建单独的控制器,并始终使用任何/任何尺寸类设计视图来创建大部分设计。我开始使用不同的设计视图,但发现管理起来太棘手。特别是某些控制器可能会出现在弹出窗口中,其中 iPad 上的尺寸类别(紧凑宽度)与主屏幕上的尺寸类别(常规宽度)不同。
2) 根据需要对各个约束、字体等进行尺寸等级调整。
3) 对于可能出现在弹出窗口中的任何视图控制器,在其前面添加一个带有故事板 ID 的 UINavigationController,该 ID 可以用作任何弹出窗口的根。
4) 对于 UISplitViewControllers,使用 showDetail 样式的 segues 正常创建。
5) 对于在分割视图控制器中用作详细信息视图,但在弹出窗口或 iOS7 上的 iPhone 上使用时也可能需要推送的 UIViewController,请从各自的主详细信息控制器创建推送转场。仅当您通过弹出窗口在拆分视图中显示设计的内容时,或者在 iPhone 上没有拆分视图的 iOS7 上时,才需要此功能。
6) 在控制器之间创建 Segue,包括 iPad/iPhone 特定的 Segue。如果只有一种可能的转场,您可以使用故事板激活。否则,只需在控制器本身之间绘制序列即可。
7) 对于任何按钮或单元格触发 Segue 的控制器,您可以添加目标操作而不是 Segue 触发器。在这些操作中,您将手动调用适当的 segue。
8) 在目标控制器类型取决于显示模式类型的每个视图控制器中,编写使用应用程序委托运行模式属性来决定使用哪个 Segue 的代码,然后使用peformSegueWithIdentifierSegue 的标识符进行调用。
这些都不是特别漂亮,但它似乎是一个必要的邪恶,特别是如果您使用分割视图控制器和弹出窗口。好处是你至少可以在一个地方看到所有的东西。
| 归档时间: |
|
| 查看次数: |
1272 次 |
| 最近记录: |