gpt4 book ai didi

objective-c - 自动布局 : how does fittingSize work exactly?

转载 作者:搜寻专家 更新时间:2023-10-30 20:10:06 26 4
gpt4 key购买 nike

我创建了一个 NSTextField 的子类,它根据它包含的文本改变它的高度。我现在想将它插入另一个 View (NSTableCellView)并根据文本字段的高度调整 View 大小。

我想使用 NSView-(NSSize)fittingSize 方法但不幸的是它似乎没有调用 fittingSize 方法它的 subview 及其 intrinsicContentSize 方法。

这是我用于 NSTableCellView 子类的代码:

- (id)initWithFrame:(NSRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[self setTranslatesAutoresizingMaskIntoConstraints:NO];
self.expandingTextField = [[JSExpandingTextField alloc] init];
[self addSubview:self.expandingTextField];
[self removeConstraints:self.constraints];
NSDictionary *row = NSDictionaryOfVariableBindings(expandingTextField);
[self addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"V:|-20-[expandingTextField]-28-|"
options:0 metrics:nil views:row]];
}

return self;
}

- (NSSize)fittingSize
{
return [super fittingSize];
}

我在这里重写了 fittingSize 方法只是为了放置一个断点或一个 NSLog

这是提供表格单元格高度的表格 View 委托(delegate)的代码:

- (JSDynamicTableCellView *)dummyCell
{
if (!_dummyCell) {
_dummyCell = [[JSDynamicTableCellView alloc] initWithFrame:NSMakeRect(0.0, 0.0, 100, 100)];
}
return _dummyCell;
}

- (CGFloat)tableView:(NSTableView *)tableView heightOfRow:(NSInteger)row
{
self.dummyCell.expandingTextField.stringValue = @"Test";
NSLog(@"Cell size %@",NSStringFromSize([self.dummyCell fittingSize]));
return [self.dummyCell fittingSize].height;
}

所有这些总是返回 69 的 dummyCell 高度,与单元格中扩展文本字段的大小无关。

问题是:'fittingSize' 方法如何确定其 subview 的大小?它应该调用它们的“fittingSize”或“ntrinsicContentSize”方法还是其他方法?

最佳答案

fittingSize 在概念上很简单。它收集已添加到您的 View 或其 subview 之一(递归)的所有约束,然后仅根据这些约束确定 View 的大小。您可以将其视为确定足以显示该 View 层次结构内容的最小尺寸。

编辑:我们需要在这里非常清楚。 fittingSize 返回最小值,并且对于未完全指定的任何维度将返回 0。例如,如果将 View 绑定(bind)到其父 View 底部的垂直约束被省略,则适合的高度将为 0。

编辑:我刚刚意识到您可能遇到了什么:fittingSize 正在计算文本字段,就好像它只是一个长行,不换行。您可以通过给它一个带有一个或多个换行符的字符串值来确认这一点:现在高度应该更大!

那么如何解决这个问题呢?嗯,你有一个文本字段,你给它内容,你想知道它的高度。但如果文本字段换行,高度将取决于宽度:使其变窄,文本字段将换行更多行,因此会占用更多高度。因此,为了测量环绕文本字段的首选高度,您必须告诉它环绕的宽度。

在 OS X Mountain Lion 和 iOS 6 上,您可以使用 [NSTextField setPreferredMaxLayoutWidth:] 方法来实现。例如,如果您想根据宽度 100 计算高度,您可以调用 [textField setPreferredMaxLayoutWidth:100];现在 fittingSize 将报告文本字段的高度,基于它以 100 的宽度环绕。

顺便说一句,这是个坏主意:

[self removeConstraints:self.constraints];

因为它删除了系统其他部分添加的约束。您应该只删除您在代码或 IB 中创建的约束。

关于objective-c - 自动布局 : how does fittingSize work exactly?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14068281/

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