gpt4 book ai didi

cocoa - NSStackView 和具有内在内容大小的 subview

转载 作者:行者123 更新时间:2023-12-03 16:17:19 27 4
gpt4 key购买 nike

我以编程方式创建了一个 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];

我希望这足够了,因为按钮具有固有的内容大小(我检查它是否返回适当的值)。

检查 View 层次结构,我可以看到按钮框架是 origin=(x=0, y=0) size=(width=40, height=50),它的 super View ( NSStackViewContainer 的一个实例)是 origin=( x=0, y=0) size=(width=0, height=0) 并且 NSStackView 是 origin=(x=0, y=0) size=(width=400, height=50)。

如您所见,NSStackViewContainer 的宽度和高度均为 0...

如果我向按钮添加宽度和高度约束,一切正常。为什么按钮的固有内容大小不够?

最佳答案

[stackViewconstraints] 可能返回一个空数组——这是不正确的并导致问题。如果是这种情况,那么当堆栈 View 位于窗口中时,没有任何东西会触发更新约束或布局的初始传递。

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

<小时/>

解决这个问题的一种方法是调用:

[window updateConstraintsIfNeeded];

[window layoutIfNeeded];

将 StackView 添加到窗口后。

<小时/>

更新:此问题已在 Yosemite 10.10 的 NSStackView 中修复。

关于cocoa - NSStackView 和具有内在内容大小的 subview ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21754004/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com