3

我有一个以编程方式创建的 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),它的超级视图(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 不够?

4

1 回答 1

5

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

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


在不添加不需要的约束的情况下解决此问题的一种方法是调用:

[window updateConstraintsIfNeeded];

或者

[window layoutIfNeeded];

在 StackView 添加到窗口之后。


更新:这已在优胜美地的 NSStackView 中修复,10.10。

于 2014-03-11T16:51:40.633 回答