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]
}
我刚刚在 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]
}