iOS 8 – UIWindow方向始终为纵向

我正在将iOS 6应用程序更新到iOS 8(iPad),而且我创build的所有新UIWindows都始终以纵向模式显示。 该应用最初支持肖像和风景方向,但现在只支持风景。

我将项目文件中支持的方向更改为“横向左”和“右横向”。 正如预期的那样,整个用户界面显示在横向,但是当我创build一个新的UIWindow ,它显示在肖像。 新的UIWindow的框架与屏幕的框架完全匹配,所以我无法想象为什么/如何以纵向模式显示。

下面的代码是我用来创build和显示新的UIWindow ,它充当模式:

 var modalWindow:UIWindow = UIWindow(frame: self.view.window!.bounds) modalWindow.backgroundColor = UIColor.blackColor().colorWithAlphaComponent(0.66) modalWindow.hidden = false modalWindow.windowLevel = (UIWindowLevelStatusBar + 1) modalWindow.addSubview(customView) modalWindow.makeKeyAndVisible() 

我一直在挣扎几个小时, UIWindow不应该默认处于横向模式,因为该应用只支持横向模式。

我将不胜感激关于如何解决这个问题的任何build议。

编辑:

我刚刚创build了一个新的testing应用程序,只支持Landscape Left和Landscape Right,问题也出现在那里。 这是一个错误? 我似乎无法理解为什么UIWindow会认为该应用程序处于纵向模式时处于纵向模式。

编辑(2015年7月2日)

这个答案在iOS 8.3+以及可能以前版本的iOS 8中都会中断。我不build议任何人使用它,特别是因为它不能保证在未来的iOS版本中工作。

我的新解决scheme使用UIViewController的标准presentViewController方法。 我初始化一个UIViewController ,添加我的自定义模式View作为UIViewController的子视图,然后使用约束来定位模态View 。 奇迹般有效!


原始答复

我离开了这一段时间,但决定今天回来。 我最终旋转模式窗口-90度,因为它自动旋转90度,以纵向显示。 我还为模式窗口的宽度和高度添加了一个小的计算,以支持iOS 7和iOS 8.下面是我的新代码:

 // Get the screen size var screenSize:CGSize = UIScreen.mainScreen().bounds.size // Use the larger value of the width and the height since the width should be larger in Landscape // This is needed to support iOS 7 since iOS 8 changed how the screen bounds are calculated var widthToUse:CGFloat = (screenSize.width > screenSize.height) ? screenSize.width : screenSize.height // Use the remaining value (width or height) as the height var heightToUse:CGFloat = (widthToUse == screenSize.width ? screenSize.height : screenSize.width) // Create a new modal window, which will take up the entire space of the screen var modalWindow:UIWindow = UIWindow(frame: CGRect(x: 0, y: 0, width: widthToUse, height: heightToUse)) modalWindow.backgroundColor = UIColor.blackColor().colorWithAlphaComponent(0.66) modalWindow.hidden = false modalWindow.windowLevel = (UIWindowLevelStatusBar + 1) modalWindow.addSubview(customView) // Create a -90 degree transform since the modal is always displayed in portrait for some reason var newTransform:CGAffineTransform = CGAffineTransformMakeRotation(CGFloat(-M_PI / 2)) // Set the transform on the modal window modalWindow.transform = newTransform // Set the X and Y position of the modal window to 0 modalWindow.frame.origin.x = 0 modalWindow.frame.origin.y = 0 modalWindow.makeKeyAndVisible() 

如上所述,这对iOS 7+和iOS 8+都很有用! 使用子视图时,请注意模式的widthheight值因为以纵向显示而被切换。 因此,如果要水平居中子视图,请使用模式窗口的height和子视图的width而不是两个视图的width