我正在尝试使用 iOS 8+ 中的 Master/Detail UISplitViewController 实现一组自适应行为,这在我看来很直观,但不是(据我所知)Apple 示例的“典型”或在我见过的任何各种 iOS 8+ UISplitViewController 教程。所以我转向这里寻求建议,认为我不能成为第一个想要这些行为的人,它们是:
1) 在所有纵向的 iPhone(加或不加)上,在主表视图中选择一个单元格会“推动”屏幕上的详细视图,并使主表视图在屏幕外显示动画——即通常的导航控制器行为。
2)在所有横向的 iPhone(加或不)上,以及在所有方向的 iPad 上,主视图在单元格选择后保持可见,直到/除非用户 a)点击详细视图内部或 b)点击“完整-screen”按钮在详细视图的顶部栏中,此时主视图动画显示在视图之外。
3) 在所有横向的 iPhone(加或不加)和所有方向的 iPad 上,详细视图会动态调整大小,以便 a) 当主视图显示时,详细视图的任何部分都不会被主视图覆盖/遮挡视图,以及 b) 当主视图不显示时,详细视图占据屏幕的整个宽度。
4) 在所有设备和所有方向上,当主视图未显示时,点击详细视图顶部栏中的按钮,会导致主视图在屏幕上显示动画 - 即,作为所有 iPhone 纵向的“弹出”方向,并在所有 iPhone(加或不加)横向和所有方向的 iPad 上作为细节视图挤压“窗格”。
换句话说,在所有方向的所有设备上——除了iPhone 的纵向方向,在这种情况下应该获得通常的导航控制器行为——主视图应该是一个细节视图挤压(而不是覆盖/模糊)“窗格”,它保持可见,直到/除非用户点击详细视图内部或详细视图顶部栏中的“转到全屏”按钮;此时,主视图应在屏幕外显示动画,而详细视图应占据屏幕的整个宽度。
任何建议/示例代码/相同的链接将不胜感激!(这些天我在 Swift 中工作,但可以很容易地将 Objective-C 代码适应 Swift。)
谢谢,
卡尔
更新 1
只需将 UISplitViewController 的 preferredDisplayMode 属性设置为 .AllVisible (Obj-C = UISplitViewControllerDisplayModeAllVisible) ,上面的要求 2 和 3 就很容易在 iPad上实现。作为附带奖励,此模式在详细信息视图的顶部栏中为我提供了所需的“进入全屏”按钮。
但是,在除 6+ 以外的任何 iPhone 上,我仍然无法获得所需的行为——即保持主要(主)和次要(细节)视图控制器在横向模式下始终可见。我希望viewWillTransitionToSize:withTransitionCoordinator
在我的自定义 UISplitViewController 中覆盖以将其辅助视图控制器的大小类设置为UITraitCollection(horizontalSizeClass: .Regular)
可以解决问题,但没有这样的运气:iOS 在 iPhone 上进行横向布局时似乎忽略了这个覆盖大小类。
我见过的一个例子(在 Ray Wenderlich 的“iOS 8 by Tutorials”中)表明在所有 iPhone 上实现我想要的方法(好吧,可能不包括 iPhone 4s,因为它的屏幕是如此“短”)是嵌入UISplitViewController 在父视图控制器的容器视图中,并覆盖该父视图控制器的viewWillTransitionToSize:withTransitionCoordinator
方法以设置子 UISplitViewController 的大小类。如果这是正确的或唯一的方法,我愿意这样做,但这似乎是一个我想尽可能避免的kludge。
更新 2
我已经尝试了 Ray Wenderlich 的技术,用于将类似 iPhone-6+ 的 UISplitViewController 横向行为扩展到其他 iPhone,并且可以确认它有效。我什至会说如果感觉不如我想象的那么笨拙,尽管它仍然不是我认为的“纯粹”解决方案(从某种意义上说,它不是我从严格的 UI 设计中得出的)方法)。
如果有人知道实现这种行为的更直接的方法,我仍然想知道它。因此,我将把它留给其他任何想要这种行为的人,并且为了寻求更好的解决方案而“未回答”。