使用UIModalPresentationStyleCurrentContext呈现视图控制器时的布局问题

我遇到了与iPad上的UISplitViewController和模式视图控制器有关的问题,所以我试图在一个小的项目中重现这个问题,看看我能否弄清楚是怎么回事。 不幸的是,这个问题似乎还在发生,但我不明白为什么。

我已经包含了一个非常小的完整的Swift程序,它重现了这个问题。 基本上,如果您在iPad上的新Swift iOS项目中运行该代码,您将看到以下行为:

该应用程序将从以下用户界面开始:

在这里输入图像说明

如果点击Present,则新的模态控制器将出现在分离控制器的细节侧。 如果我点击closures该模式控制器,我会回到相同的初始界面,一切都很好。

但是,如果点击Present,然后在出现的模式控制器上点击Present(所以我在原始细节视图中有两个模态控制器),然后closures第一个, RightViewController接pipe整个屏幕,消除了分割视图控制器:

在这里输入图像说明

整个下午,我一直在对着这个头。 有什么我失踪?

以下是示例应用程序的完整源代码:

 import UIKit class RightController: UIViewController { override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) { super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) self.title = "Right" } required init(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func loadView() { super.loadView() let label = UILabel(frame: CGRect(x: 0, y: 100, width: 100, height: 20)) label.text = "Top Left" self.view.addSubview(label) let presButton = UIBarButtonItem(title: "Present", style: .Plain, target: self, action: Selector("present:")) self.navigationItem.rightBarButtonItem = presButton self.navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Dismiss", style: .Plain, target: self, action: Selector("dismiss:")) } func dismiss(sender: AnyObject) { self.dismissViewControllerAnimated(true, completion: nil) } func present(sender: AnyObject) { let rc = RightController() let nav = UINavigationController(rootViewController: rc) nav.modalPresentationStyle = .CurrentContext self.presentViewController(nav, animated: true, completion: nil) } } @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate, UISplitViewControllerDelegate { var window: UIWindow? func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { let splitViewController = UISplitViewController() splitViewController.delegate = self let nav1 = UINavigationController(rootViewController: UIViewController()) nav1.title = "Left" let nav2 = UINavigationController(rootViewController: RightController()) splitViewController.viewControllers = [nav1, nav2] self.window!.rootViewController = splitViewController return true } } extension AppDelegate: UISplitViewControllerDelegate { func splitViewController(svc: UISplitViewController, shouldHideViewController vc: UIViewController, inOrientation orientation: UIInterfaceOrientation) -> Bool { return false } } 

编辑 :通过设备的方向循环导致分割视图控制器正确重绘本身,至less直到解除button再次按下。

编辑 :我也可以得到这个工作,如果我在iOS 8中使用新的.OverCurrentContext演示风格。但是,我不能删除与iOS 7的兼容性,所以我需要一个不同的解决scheme。

我有一个解决scheme,虽然我会第一个承认,但确实感觉有点不好意思。 我认为你的问题很大一部分源于.CurrentContext一个变化,经过一些testing,我发现它在iOS 7和8+中的function是不同的。 因此,如果您根据iOS版本select适当的样式,则一切正常。

 var presStyle: UIModalPresentationStyle = (UIDevice.currentDevice().systemVersion as NSString).integerValue == 7 ? .CurrentContext : .OverCurrentContext nav.modalPresentationStyle = presStyle