2014-02-13 48 views
2

我有一个NSStackView以编程方式创建,我添加了一个NSButton。NSStackView和固有内容大小的子视图

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)大小=(宽度= 0,高度= 0)并且NSStackView是原点=(x = 0,y = 0)大小=(宽度= 400,高度= 50)。

正如你可以看到NSStackViewContainer具有0宽度和高度...

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

回答

4

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

在窗口中添加自己的约束将足以触发它,但如果NSStackView不是其他方式(这可能值得提供雷达),它应该能够触发它自己。


一种方法来解决这个问题,无需增加不必要的限制,是调用:在StackView已添加到窗口

[window updateConstraintsIfNeeded]; 

[window layoutIfNeeded]; 

后。


更新:这是在优胜美地固定在NSStackView,10.10。

+0

即使在10.12我结束了一个堆栈视图不会产生约束。在添加子视图(甚至在将视图添加到窗口之前)之后,不是强制整个窗口更新约束,而只是简单地调用'[stackView updateConstraintsForSubtreeIfNeeded]'/'stackView.updateConstraintsForSubtreeIfNeeded()'就足够了。 – DarkDust

相关问题