Autolayout 不适用于带有 Storyboard 的 NSSplitView 和 NSPageController。这是苹果虫吗?

Autolayout is not working with NSSplitView and NSPageController with Storyboard. Is this Apple Bug?

我刚刚在 github 上创建了一个空项目 --> here <-- 以演示问题(在 objective-c 中完成)

该项目是一个简单的故事板项目。 NSWindowController 加载 NSPageController,后者加载包含 3 个窗格的 NSSplitView。示例项目中没有代码,除了加载屏幕的代码。当项目运行时,它看起来像这样 .

如何在 window 调整大小时获得约束以使 splitView 一直延伸到末端?奇怪的是,如果您将 NSWindowController 的 contentController 从 NSPageController 切换到 NSSplitViewController,那么一切都会按预期进行。这是苹果虫吗?如果有任何答案 swift/objectivec,我将不胜感激。我试过了,但没有任何效果。

[编辑] - 基于下面的答案和进一步研究(联系苹果),NSPageViewController 似乎不使用自动布局约束,但依赖于自动调整掩码和框架设置它的子视图。

所以当页面控制器创建它的视图控制器时,我们应该这样设置:

-(NSViewController *)pageController:(NSPageController *)pageController viewControllerForIdentifier:(NSString *)identifier {
    NSViewController *viewController = [self.storyboard instantiateControllerWithIdentifier:identifier];
    [viewController.view setAutoresizingMask:(NSViewWidthSizable|NSViewHeightSizable)];
    return viewController;
}

至此,问题解决。我希望作为未来的更新,此控件可与自动布局约束一起使用,因为它看起来更自然。

我在使用 NSPageController 时遇到了很多问题。我发现解决方案是不使用自动布局。

尝试在 NSSplitView 上使用 NSAutoresizingMaskOptions。 首先,删除 NSPageController.

内的所有约束

然后:

splitView.autoresizingMask = NSViewWidthSizable | NSViewHeightSizable;
splitView.frame = pageController.view.bounds;

splitView.autoresizingMask = [.ViewWidthSizable, .ViewHeightSizable]
splitView.frame = pageController.view.bounds

编辑

根据您的项目制作了一个项目here

我在 Pagecontroller 中也遇到了同样的问题:

并使用给定的代码解决了它:

 func pageController(_ pageController: NSPageController, viewControllerForIdentifier identifier: String) -> NSViewController {
    switch identifier {
    case "formController":
        let controller = NSStoryboard(name: "Main", bundle:nil).instantiateController(withIdentifier: "formController") as! FormController
        controller.view.autoresizingMask = [.height , .width]
        return controller
    default:
        return self.storyboard?.instantiateController(withIdentifier: identifier) as! NSViewController
    }
}

func pageController(_ pageController: NSPageController, identifierFor object: Any) -> String {

    return String(describing: object)

}

func pageControllerDidEndLiveTransition(_ pageController: NSPageController) {
    print(pageController.selectedIndex)

    pageController.completeTransition()
     pageController.selectedViewController!.view.autoresizingMask = [.height , .width]

}