NSTableView: как правильно изменить размер текста в ячейках

Мне нужно увеличить размер шрифта в 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];

Я немного заблудился здесь... Думаю, мне не хватает чего-то простого, но я понятия не имею, где искать...

Спасибо Ян

1 ответ

Вы должны убедиться, что ваши ограничения установлены, чтобы ваш NSTextField мог расти автоматически при достижении прохода автоматического размещения - не должно быть ЛЮБОГО ограничения на высоту NSTextField, потому что он будет иметь внутреннюю высоту, основанную на fontSize.

Кроме того, в основанном на представлении режиме также есть ошибка, когда выходы textView и textView cellView обрабатываются специально: в NSTableCellView фактически устанавливает фрейм DIRECTLY на его textField и imageView в его -viewWillDraw, игнорируя горизонтальные ограничения и нарушая свои правила по верстке. (Это подано как Радары 11713245 и 15359487).

Вот код, который я использую, чтобы обойти эту ошибку в моем пользовательском классе NSTableCellView для 10.8 и 10.9. Обратите внимание, в моем случае мне нужно было только сбросить смещения по 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}];
}
Другие вопросы по тегам