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

问题描述 投票:3回答:2

我有一个以编程方式创建的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不够?

cocoa autolayout nsstackview
2个回答
5
投票

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

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


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

[window updateConstraintsIfNeeded];

要么

[window layoutIfNeeded];

将StackView添加到窗口后。


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


0
投票

你不应该使用addArrangedSubview而不是addView吗?

© www.soinside.com 2019 - 2024. All rights reserved.