故事板有两个ViewControllers-s,一个用于纵向方向(简称VCPort
),另一个用于横向(VCLand
)。我希望应用程序在旋转设备时自动切换到正确的布局。
为此,我有两个从VSPort到VCLand的portToLand
和相反方向的LandToPort
。然后我重写willRotateToScreenOrientation
,如下所示。
对于VCPort类:
override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval)
{
if toInterfaceOrientation.isLandscape {
switchViewController()
}
}
func switchViewController() {
performSegueWithIdentifier("portToLand", sender: self)
}
对于VCLand课程,我有isPortrait
而不是isLandscape
和"landToPort"
而不是"portToLand"
。
如果故事板以纵向方向开始,一切正常。当故事板在设备处于横向状态时启动(例如使用IPad Retina)时,VCPort仍然将控件作为链中的第一个ViewController并且willRotateToScreen不会出现。为了使应用程序在这种情况下切换到横向布局,我将以下代码放在viewDidLoad
中,用于VCPort类:
override func viewDidLoad() {
super.viewDidLoad()
if UIApplication.sharedApplication().statusBarOrientation.isLandscape {
switchViewController()
}
}
使用调试器进行跟踪显示调用了performSegueWithIdentifier,但是VCLand没有获得控件,应用程序仍显示VCPort布局!假设我做得太早,我尝试viewWillAppear
代替viewDidLoad
- 没有区别。
感谢您提出任何意见。
答案 0 :(得分:0)
在切换视图之前,请稍等片刻。并将代码移至viewWillAppear,因为当app处于暂停状态时,方向可能会发生变化:
var timer : NSTimer?
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
let deviceOrientation = UIDevice.currentDevice().orientation
var isLandscape : Bool;
if deviceOrientation == UIDeviceOrientation.Unknown {
isLandscape = UIApplication.sharedApplication().statusBarOrientation.isLandscape
} else {
isLandscape = deviceOrientation.isLandscape
}
if isLandscape {
self.view.hidden = true
timer = NSTimer.scheduledTimerWithTimeInterval(0.05, target: self, selector: Selector("switchViewController"), userInfo: nil, repeats: false)
} else {
self.view.hidden = false
}
}
override func viewWillDisappear(animated: Bool) {
if (timer != nil) {
timer!.invalidate()
timer = nil
}
}