我现在正在试着解决我认为简单的功能。我正在使用Xcode 6.2为iPad创建一个带有3个视图控制器的iOS 8应用程序。我的目标是一旦应用程序启动,它将锁定该横向方向的所有视图。如果它已关闭并在其他横向方向中重新打开,则所有视图都使用该方向。我确实使用下面的代码,但必须添加导航控制器,因为我需要一个导航栏,它现在总是旋转。我发现一些信息,这可能是iOS8中的一个错误。我尝试过的建议没有解决问题,因为它是Object-C,这很有意思,但因为它不是很快就丢失了。
iOS 6 shouldAutorotate: is NOT being called
是否有一种简单的方法可以通过强制导航控制器停止旋转来实现此目的?这是一个曾经工作的片段,每个VC中的锁屏代码: -
// Get orintation of screen if 'true' Home button on RIGHT
if (UIDevice.currentDevice().orientation == UIDeviceOrientation.LandscapeLeft) {
Oriention_Number = HomeButtonRight
Screen_Orient_Vert = -1
Screen_Orient_Horiz = 1
} else {
Oriention_Number = HomeButtonLeft
Screen_Orient_Vert = 1
Screen_Orient_Horiz = -1
}
preferences.setInteger(Oriention_Number, forKey: "Oriention_Number_Prefs")
// Lock Screen
override func shouldAutorotate() -> Bool {
return false
}
override func supportedInterfaceOrientations() -> Int {
return Oriention_Number // Landscape HomeButtonLeft = 16 HomeButtonRight = 8
}
答案 0 :(得分:1)
通过UINavigationController不会将shouldAutorotate
次调用传递给其子级。为UINavigationController(或它的子类)添加一个类别,并实现以下内容:
- (BOOL)shouldAutorotate
{
return [self.topViewController shouldAutorotate];
}
然后,这将使用您现有的shouldAutorotate
逻辑。
答案 1 :(得分:0)
子类UINavigationController:
class LandscapeNC2:UINavigationController {
override func supportedInterfaceOrientations() -> Int {
var s:UIInterfaceOrientationMask = .LandscapeRight
let o:UIDeviceOrientation = UIDevice.currentDevice().orientation
if (o == .LandscapeRight) || (o == .PortraitUpsideDown) { s = .LandscapeLeft }
return Int(s.rawValue)
}
}
这有用吗?我没有测试过它。
您需要将UINavigationController的定义更改为LandscapeNC2
。确定旋转能力的控制器是当前覆盖整个屏幕的一组控制器中最根本的一个。如果你有一个UINavigationController,那通常是决定旋转的那个。
您会发现永远不会调用由UINavigationController管理的VC的supportedInterfaceOrientations
方法。那是因为当它们在屏幕上时,UINavigationController的标签栏也在屏幕上,这更接近VC的堆栈根。