在整个NSTableView / NSOutlineView的字体大小之后动态更改行高

时间:2013-06-13 20:00:54

标签: objective-c cocoa nstableview nsoutlineview

我正在动态更改NSOutlineView中所有单元格的字体大小。我能够成功地改变实际的字体大小:(夸大效果的字体大小):

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

但是NSOutlineView中行的行高不会改变。细胞都具有先前的高度(17磅) - 但是具有32pt文本。我已经尝试了[myTable tile]和[myTable reloadData],但这并没有重新计算行高。

我看到-noteHeightOfRowsWithIndexesChanged。是否正在加载一个NSIndexSet并调用noteHeightOfRowsWithIndexesChanged获取行自动调整的唯一方法?

1 个答案:

答案 0 :(得分: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];