我有一个以编程方式创建的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=(origin=,en19#)。
如您所见,NSStackViewContainer的宽度和高度为0.
如果我在按钮中添加一个宽度和高度约束,一切都可以正常工作。为什么按钮intrinsicContentSize还不够?
发布于 2014-03-11 16:51:40
[stackView constraints]可能正在返回一个空数组--这是不正确的,并且会导致问题。如果是这样的话,那么当堆栈视图在窗口中时,没有什么会触发更新约束或布局的初始传递。
在窗口中添加您自己的约束就足以触发它,但是如果不是这样的话,NSStackView应该能够触发它本身(这可能值得对其进行雷达检查)。
在不添加不必要的约束的情况下,解决此问题的一种方法是调用:
[window updateConstraintsIfNeeded];或
[window layoutIfNeeded];在将StackView添加到窗口后。
Update:这是在NSStackView中修正的,在约塞米蒂,10.10。
https://stackoverflow.com/questions/21754004
复制相似问题