我应该如何在NSSplitView子视图中使用自动布局约束?
我的NSSplitView子视图有3个子视图:topPane、tableContainer和bottomPane,我将约束设置如下:
NSDictionary* views = NSDictionaryOfVariableBindings(topPane, tableContainer, bottomPane);
for (NSView* view in [views allValues]) {
[view setTranslatesAutoresizingMaskIntoConstraints:NO];
}
[myView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[topPane(34)][tableContainer][bottomPane(24)]|"
options:0
metrics:nil
views:views]];
[mySplitView addSubview:myView];并在控制台中获得了以下内容:
Unable to simultaneously satisfy constraints:
(
"<NSLayoutConstraint:0x7fd6c4b1f770 V:[NSScrollView:0x7fd6c4b234c0]-(0)-[CPane:0x7fd6c4b2fd10]>",
"<NSLayoutConstraint:0x7fd6c4b30910 V:[CPane:0x7fd6c4b2f870(34)]>",
"<NSLayoutConstraint:0x7fd6c4b30770 V:|-(0)-[CPane:0x7fd6c4b2f870] (Names: '|':NSView:0x7fd6c4b22e50 )>",
"<NSLayoutConstraint:0x7fd6c4b212f0 V:[CPane:0x7fd6c4b2fd10]-(0)-| (Names: '|':NSView:0x7fd6c4b22e50 )>",
"<NSLayoutConstraint:0x7fd6c4b2f910 V:[CPane:0x7fd6c4b2f870]-(0)-[NSScrollView:0x7fd6c4b234c0]>",
"<NSLayoutConstraint:0x7fd6c4b21290 V:[CPane:0x7fd6c4b2fd10(24)]>",
"<NSAutoresizingMaskLayoutConstraint:0x7fd6c3630430 h=--& v=--& V:[NSView:0x7fd6c4b22e50(0)]>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x7fd6c4b1f770 V:[NSScrollView:0x7fd6c4b234c0]-(0)-[CPane:0x7fd6c4b2fd10]>我认为这是<NSAutoresizingMaskLayoutConstraint:0x7fd6c3630430 h=--& v=--& V:[NSView:0x7fd6c4b22e50(0)]>造成的,但我不能重置自动调整大小的掩码,因为NSSplitView设置了它。
在拆分视图中使用自动布局的最佳方式是什么?有没有办法在没有NSSplitViewDelegate的情况下自动布局拆分视图子视图的最小/最大尺寸
发布于 2012-11-06 01:31:01
我发现,如果我在我的窗口中有工具栏,并通过以下任何委托方法控制拆分视图,就会出现这个错误:
splitView:constrainMinCoordinate:ofSubviewAt:
splitView:constrainMaxCoordinate:ofSubviewAt:
splitView:shouldAdjustSizeOfSubview:在将工具栏附加到windowDidLoad中的窗口中找到了解决方案。
发布于 2012-08-18 10:01:20
NSSplitView从一开始就是一个奇怪的东西,如果它很快就会消失,我不会感到惊讶。在尝试让NSSplitView与AutoLayout一起工作了一个月之后,我终于放弃了。
我的解决方案是根本不在AutoLayout中使用NSSplitView。所以无论是没有自动布局的NSSplitView还是没有NSSplitView的自动布局:这并不像听起来那么复杂:只需将你的子视图放在一起,并添加NSLayoutConstraints作为IBOutlets即可。然后,可以在代码中从控制器设置和更改这些约束的常量。使用这种方法,您可以设置原点(负偏移量以将其滑出窗口)、宽度以及与其他子视图的关系-此外,使用视图的动画制作工具可以很容易地对约束进行动画处理(是否尝试过对NSSplitView进行动画处理?)
唯一缺少的是鼠标在分隔符上的拖动,但这可以通过几行代码来实现,在自定义的"SplitView“中跟踪mouseEvents。
有一个来自苹果的自动布局"splitview“的例子(不幸的是只有垂直的),我最近在github上看到了至少一个新项目。虽然对我来说,我认为用我的定制解决方案来满足我的应用程序的特定需求会更容易,而不是试图创建一些非常通用的东西(从而使它变得过于复杂,难以处理)。
编辑:我现在完成了我的自定义splitView,它从单独的nibs加载它的子视图。没有约束问题,没有自动布局警告。相比于花了整整一个月的时间尝试使用NSSplitView,我现在有了一个基于约束的工作自定义splitView,很容易动画化,只用了一个晚上就创建好了。我绝对推荐你走这条路!
发布于 2012-12-20 10:39:21
对于将来偶然发现这一点并正在寻找基于约束的NSSplitView替代的任何人,我在这里写了一个小项目,试图使用自动布局重新创建NSSplitView的一部分功能:
https://github.com/jwilling/JWSplitView
它有点but,但对于任何想要走这条路的人来说,它都是一个有用的参考。
https://stackoverflow.com/questions/11262080
复制相似问题