我正在编写一个iOS应用程序,其中包含一些固定(纵向)视图和一些与方向相关的视图(纵向,左视图和右视图).
视图包含在基于以下代码的自定义导航控制器中:
class CustomNavigationViewController: UINavigationController {
override func supportedInterfaceOrientations() -> Int {
return self.topViewController.supportedInterfaceOrientations()
}
override func shouldAutorotate() -> Bool {
return self.topViewController.shouldAutorotate()
}
}
我正在nav子控制器中实现supportedInterfaceOrientations()和shouldAutorotate().
这是一个测试控制器
class TestViewController: UIViewController {
var shouldRotate: Bool = false
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
self.shouldRotate = true
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
convenience init(rotation shouldRotate: Bool) {
self.init(nibName: "TestViewController", bundle: nil)
self.shouldRotate = shouldRotate
}
override func supportedInterfaceOrientations() -> Int {
if shouldRotate == false {
return UIInterfaceOrientation.Portrait.rawValue
} else {
return super.supportedInterfaceOrientations()
}
}
override func shouldAutorotate() -> Bool {
return shouldRotate
}
override func didRotateFromInterfaceOrientation(fromInterfaceOrientation: UIInterfaceOrientation) {
println("from: \(fromInterfaceOrientation.rawValue)")
}
@IBAction func buttonTapped(sender: AnyObject) {
let newvc = TestViewController(rotation: true)
self.navigationController?.pushViewController(newvc, animated: true)
}
}
第一个控制器在AppDelegate中实例化,其旋转:false.其他控制器使用rotation创建:true并在点击按钮后按下.
以下是该视图的屏幕截图:
如果我在第一个(可旋转的)之后改变控制器上的方向,我得到以下结果:
控制器xib使用自动布局,如果我在点击按钮之前旋转设备,它会按预期工作,视图将填满整个屏幕.
此外,如果我在手机处于横向状态时轻按后退按钮,则第一个视图将锁定在此状态:
我正在将应用程序部署到iOS 8.
如何在旋转后仅制作第一个视图肖像并正确布置其他视图?
最佳答案 它可能无关紧要,因为它只打印出一个调试消息,但不要忘记在iOS 8中使用viewWillTransitionToSize(_:withTransitionCoordinator :)折旧didRotateFromInterfaceOrientation(_ :),并将其视为视图大小更改的责任(包括轮换).
我认为你是在正确的轨道上,但不是覆盖bothAutorotate()和supportedInterfaceOrientations()只覆盖supportedInterfaceOrientations().
我只是做了一个快速的POC,看看它是否有用.我在创建视图控制器(并使用Swift 2)时没有设置标志,但是你明白了:
class RotatingViewController: UIViewController {
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
return UIInterfaceOrientationMask.All
}
}
class FixedViewController: UIViewController {
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
return UIInterfaceOrientationMask.Portrait
}
}
class NavigationController: UINavigationController {
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
return self.topViewController?.supportedInterfaceOrientations() ?? UIInterfaceOrientationMask.All
}
}
我认为您的演示中发生的事情是,当您转换到已修复的视图控制器时,您要求它进入纵向(即它)但不允许屏幕旋转回纵向模式.
所以..只是尝试删除CustomNavigationViewController中的’shouldAutorotate()’,看看是否有效.