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}];
}