2013-06-13 2 views
1

Я динамически изменяю размер шрифта всех ячеек в NSOutlineView. Я в состоянии успешно изменить фактический размер шрифта: (размер шрифта преувеличены для эффекта):Динамически изменяющаяся высота строки после размера шрифта всего NSTableView/NSOutlineView

id cell = [myOutlineColumn dataCell]; 
[cell setFont: [NSFont fontWithName: @"Geneva" size:32.0] ]; 

Но высоту строки строки в NSOutlineView не изменяются. Все ячейки имеют предыдущую высоту (17 pt), но с 32-кратным текстом. Я пробовал [myTable tile] и [myTable reloadData], но это не повторяет высоту строки.

Я видел -номерHeightOfRowsWithIndexesChanged. Является ли загрузка NSIndexSet и вызовом noteHeightOfRowsWithIndexesChanged единственным способом автоматической настройки строк?

ответ

2

Вам необходимо позвонить -setRowHeight: на экране после изменения размера шрифта. Например. [outlineView setRowHeight: [font pointSize] +2.0].

Для получения наилучших высот для строки, вот что я делаю в моем приложении:

CGFloat KBDefaultLineHeightForFont (NSFont *font, BOOL sizeForTextField) 
{ 
    if (font == nil) 
     font = [NSFont userFontOfSize:0]; // Use default system font if font is nil. 

    NSLayoutManager *lm = [[NSLayoutManager alloc] init]; 

    if (sizeForTextField) 
     [lm setTypesetterBehavior:NSTypesetterBehavior_10_2_WithCompatibility]; 

    // On Mountain Lion and above, string drawing is done without using screen fonts, so we must do the same. 
    if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_7) 
     [lm setUsesScreenFonts:NO]; 

    CGFloat height = [lm defaultLineHeightForFont:font]; 
    [lm release]; 

    return height; 
} 

Тогда:

CGFloat rowHeight = MAX(16.0, KBDefaultLineHeightForFont(ovFont, YES) + 3.0); 
[outlineView setRowHeight:rowHeight]; 
[[[[outlineView tableColumns] objectAtIndex:0] dataCell] setFont:ovFont]; 
+0

Так что нет никакого способа для взять на себя, чтобы спросить клетки для их высоты и построить высоту строки из этого? – SMGreenfield

+0

Не напрямую, потому что высоты ячеек не изменяются, пока вы не установите высоту строки в виде контура. То, что вы, вероятно, могли бы сделать, это call-cellSizeForBounds: на ячейке, передав FLT_MAX для прямой высоты. Я делаю это в виде схемы, который имеет переменную высоту строки для ячеек, которые могут обертывать текст, но это, вероятно, слишком велико, если все ваши строки будут одинаковой высоты. То, как я делаю это для случая, подобного вашему, - это вызвать пользовательскую функцию, чтобы получить максимальную высоту шрифта, используя NSLayoutManager's -defaultLineHeightForFont :, затем добавьте пару пикселей и установите это значение с помощью -setRowHeight. – kayembi

+0

Я обновил свой ответ выше, используя код, который я использую, чтобы вычислить наилучшую высоту строки для используемого шрифта. – kayembi

Смежные вопросы