为什么我的iPad布局在轮换时不会重新调整?

时间:2016-07-20 09:47:12

标签: ios swift ipad layout landscape-portrait

我有一个适用于iPad的Split View控制器,它应该支持这两种方向(纵向和横向)。

问题是当我更改设备的方向时,细节视图不会重新调整以使用整个空间,并且会出现灰色方块。

enter image description here

我不认为这是约束的问题,因为这只有在我旋转时才会发生:

  • 当我以纵向模式启动应用程序时,布局加载良好。
  • 当我以横向模式启动应用程序时,布局加载良好。

enter image description here

在SplitViewController(以及DetailsController中)我尝试了这段代码:

在viewDidLoad中:

 NSNotificationCenter.defaultCenter().addObserver(self, selector: "rotated", name: UIDeviceOrientationDidChangeNotification, object: nil)

然后:

override func shouldAutorotate() -> Bool {
    print("should rotate --> true")
    return true
}

override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
    print("we support all orientations")
    return UIInterfaceOrientationMask.All
}

override func preferredInterfaceOrientationForPresentation() -> UIInterfaceOrientation {
    print("preferred orientation for presentation is landscape")
    return UIInterfaceOrientation.LandscapeLeft
}

func rotated(){
    print("rotatiooooonn ------------")
    refreshIpad()
    detailSplitViewController.refreshUI()
}

func refreshIpad (){
    dispatch_async(dispatch_get_main_queue(),{
        self.view.setNeedsLayout()
    })
}

在日志中,我得到了这个(因此无论何时发生方向变化,我都可以看到)

should rotate --> true
we support all orientations
rotatiooooonn ------------

以下是信息文件:

enter image description here

修改

故事板: enter image description here

详细信息视图中的约束:

enter image description here

1 个答案:

答案 0 :(得分:0)

serialize(node:DOMNode, args:Object):void : Serializes the specified browser DOM node into a HTML string.中,您需要为所有子视图显式调用refreshIpad(),因为它不会递归发生,

setNeedsLayout()

递归解决方案(Swift 3.0)

func refreshIpad() {
    dispatch_async(dispatch_get_main_queue(),{
        self.view.setNeedsLayout()
        for subview in self.view.subviews {
            subview.setNeedsLayout()
        }
    })
}