我有一个以编程方式创建的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不够?
答案 0 :(得分:5)
[stackView constraints]
可能返回一个空数组 - 这是不正确的并导致问题。
如果是这种情况,那么当堆栈视图在窗口中时,没有任何东西触发更新约束或布局的初始传递。
在窗口中添加自己的约束就足以触发它,但是如果不是这样的话,NSStackView应该能够触发它(这可能值得提起雷达)。
解决此问题的一种方法是调用:
,而不添加不必要的约束[window updateConstraintsIfNeeded];
或
[window layoutIfNeeded];
将StackView添加到窗口后。
更新:这在Yosemite,10.10中的NSStackView中得到修复。
答案 1 :(得分:0)
您不是要使用addArrangedSubview而不是addView吗?