使用segues适应当前的屏幕方向

时间:2015-05-17 01:41:21

标签: ios segue uiinterfaceorientation

故事板有两个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 - 没有区别。

感谢您提出任何意见。

1 个答案:

答案 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
        }
    }