1

我需要增加 NSTableView(基于视图的模式)中的字体大小,以便在我的应用程序的某种演示中提供更好的可读性。

更改字体在以下范围内可以正常工作- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row

    NSTableCellView *cellView = [tableView makeViewWithIdentifier:identifier owner:self];
    [cellView.textField setFont:self.tableFont];
    cellView.textField.stringValue = rowData[row];
    [cellView.textField setNeedsDisplay:YES];

我还用 更新了 rowHeight - (CGFloat) tableView:(NSTableView *)tableView heightOfRow:(NSInteger)row,这也有效:

- (CGFloat) tableView:(NSTableView *)tableView heightOfRow:(NSInteger)row {
    if (self.tableFont) {
        NSLog(@"Setting row height to %.1f", [self.tableFont pointSize]+8);
        return [self.tableFont pointSize] + 8;
    }
    return [NSFont systemFontSize] + 8;
}

(可能有更优雅的方法来确定正确的高度)

现在,这是我的问题:我确实看到字体正在更改。我还看到 rowHeight 正在更改(当我使用交替行着色时非常明显)。但是单元格中的文本似乎被剪裁到原来的高度(可能是 17 像素),所以对于较大的字体,我只能看到文字的顶部,然后是一些空白,然后又是下一行的上部.

对我来说,它看起来像一些视图剪辑 NSTableViewCell 到它的旧高度......我已经玩过将框架和边界设置为不同的值,但这并没有改变任何东西:

    NSRect rect = [cellView.textField frame];
    rect.origin.y = 1;
    rect.size.height = [self.tableFont pointSize] + 6;
    [[cellView.textField cell] setFrame:rect];
    [cellView.textField setFrame:rect];
    [cellView.textField setBounds:rect];
    [cellView.textField setNeedsDisplay:YES];
    [cellView setFrame:rect];
    [cellView setBounds:rect];
    [cellView setNeedsDisplay:YES];

我有点迷路了......我想我错过了一些简单的东西,但我不知道在哪里看......

谢谢,扬

4

1 回答 1

2

您必须确保设置了约束,以便在自动布局通过时您的 NSTextField 可以自动增长 - NSTextField 的高度不应该有任何约​​束,因为它将具有基于 fontSize 的固有高度。

此外,在基于视图的模式下,还有一个错误功能,即 cellView 的“textField”和“imageView”出口被特殊处理:在 NSTableCellView 中,实际上将在其 -viewWillDraw 中的 textField 和 imageView 上直接设置框架,忽略水平约束和打破自己的布局规则。(这被归档为雷达 11713245 和 15359487)。

这是我在 10.8 和 10.9 的自定义 NSTableCellView 类中用于解决此错误功能的代码。请注意,在我的情况下,我只需要重置字段的 x 偏移量:

#pragma mark NSView

- (void)viewWillDraw;
{
    const NSRect imageViewFrame = self.imageView.frame, textFieldFrame = self.textField.frame;

    [super viewWillDraw]; // NSTableCellView in  source list-mode outline view will apply custom metrics and positioning here by calling -_doStandardRowSizeStyleLayout, which manually calls setFrame: on the textField and imageView, screwing up our autolayout...

    // ...so put the x offsets back the way we really wanted them, dammit (Radar 11713245, 15359487)
    if (imageViewFrame.origin.x != self.imageView.frame.origin.x)
        [self.imageView setFrameOrigin:(NSPoint){imageViewFrame.origin.x, self.imageView.frame.origin.y}];

    if (textFieldFrame.origin.x != self.textField.frame.origin.x)
        [self.textField setFrameOrigin:(NSPoint){textFieldFrame.origin.x, self.textField.frame.origin.y}];
    if (textFieldFrame.size.width != self.textField.frame.size.width)
        [self.textField setFrameSize:(NSSize){textFieldFrame.size.width, self.textField.frame.size.height}];
}
于 2014-01-11T07:21:22.790 回答