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

Why does my iPad layout not readjust upon rotation?

我有一个 iPad 的拆分视图控制器,它应该支持两个方向(纵向和横向)。

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

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

在 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 ------------

以下是信息文件:

编辑

故事板:

详细信息视图中的约束:

refreshIpad() 中,您需要为所有子视图显式调用 setNeedsLayout(),因为它不会递归发生,

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

递归求解(Swift3.0)

extension UIView {
    func setNeedsLayoutForSubviews() {
        self.subviews.forEach({
            [=11=].setNeedsLayout()
            [=11=].setNeedsLayoutForSubviews()
        })
    }
}

func refreshIpad() {
    DispatchQueue.main.async {
        self.view.setNeedsLayout()
        self.view.setNeedsLayoutForSubviews()
    }
}