NSStackView和具有内在内容大小的子视图

时间:2014-02-13 12:16:01

标签: cocoa autolayout nsstackview

我有一个以编程方式创建的NSStackView,我添加了一个NSButton。

    NSStackView *stackView = [[NSStackView alloc] initWithFrame:rect];
    stackView.autoresizingMask = NSViewWidthSizable|NSViewHeightSizable;
    stackView.alignment = NSLayoutAttributeBaseline;
(...)
    NSButton *button = [[NSButton alloc] initWithFrame:CGRectMake(0, 0, 40, 50)];
    button.image = item.image;
    button.title = item.name;
    button.bordered = NO;
    button.imagePosition = NSImageAbove;
    button.translatesAutoresizingMaskIntoConstraints = NO;
(...)

    [stackView addView:button inGravity:NSStackViewGravityLeading];

由于按钮具有固有的内容大小(我检查它返回了一个合适的值),我原以为这已经足够了。

检查视图层次结构我可以看到按钮框架是origin =(x = 0,y = 0)size =(width = 40,height = 50),它的superview(NSStackViewContainer的一个实例)是origin =( x = 0,y = 0)size =(width = 0,height = 0),NSStackView是origin =(x = 0,y = 0)size =(width = 400,height = 50)。

如您所见,NSStackViewContainer的宽度和高度为0 ......

如果我添加宽度&按钮的高度限制一切正常。为什么按钮intrinsicContentSize不够?

2 个答案:

答案 0 :(得分:5)

[stackView constraints]可能返回一个空数组 - 这是不正确的并导致问题。 如果是这种情况,那么当堆栈视图在窗口中时,没有任何东西触发更新约束或布局的初始传递。

在窗口中添加自己的约束就足以触发它,但是如果不是这样的话,NSStackView应该能够触发它(这可能值得提起雷达)。


解决此问题的一种方法是调用:

,而不添加不必要的约束
[window updateConstraintsIfNeeded];

[window layoutIfNeeded];
将StackView添加到窗口后


更新:这在Yosemite,10.10中的NSStackView中得到修复。

答案 1 :(得分:0)

您不是要使用addArrangedSubview而不是addView吗?

相关问题