2014-11-15 46 views
1

根據Apple's documentation on [NSTableViewDelegate tableView:sizeToFitWidthOfColumn:]默認[NSTableViewDelegate的tableView:sizeToFitWidthOfColumn:]不會被調用

默認情況下,NSTableView的遍歷表中的每一行,通過訪問一個preparedCellAtColumn細胞 :行:和請求cellSize找到 合適的最大寬度來使用。

爲了獲得準確的結果和性能,建議在使用大型表格時實施此 方法。默認情況下,較大的 表使用蒙特卡洛模擬,而不是迭代每一行。

默認行爲正是我想要的東西,所以我選擇不執行我的NSTableViewDelegate此方法。但是,當我雙擊列的大小調整分隔線時,什麼都不會發生。我的表格視圖是基於視圖的。

回答

0

從OS X 10.10.2開始,基於視圖的表格視圖中的列在雙擊列分隔符時仍不會自動調整大小。

我實現了代表可視矩形的樣本行以及50行以下和以上的代表。

- (CGFloat)tableView:(NSTableView *)tableView sizeToFitWidthOfColumn:(NSInteger)column 
{ 
    // Note: Called on double-click of table columns separator 
    // Note: As of 10.10.2, [NSTableView _sizeToFitWidthOfColumn] does nothing for view-based table views 
    NSRect   visibleRect  = tableView.visibleRect; 
    NSRange   rowRange  = [tableView rowsInRect:visibleRect]; 
    NSUInteger  numberOfRows = tableView.numberOfRows; 
    NSInteger  minRow   = rowRange.location; 
    NSInteger  maxRow   = rowRange.location + rowRange.length; 

    minRow = MAX(0, minRow - 50); 
    maxRow = MIN(numberOfRows, maxRow + 50); 

    NSTableColumn *tableColumn = [[tableView tableColumns] objectAtIndex:column]; 
    CGFloat   minWidth  = tableColumn.minWidth; 
    CGFloat   maxWidth  = tableColumn.maxWidth; 
    CGFloat   width   = minWidth; 

    /* 
    NSCell   *headerCell  = tableColumn.headerCell; 

    if ([headerCell isKindOfClass:[NSCell class]]) { 
     NSRect bounds   = NSMakeRect(0.0f, 0.0f, maxWidth, headerCell.cellSize.height); 
     CGFloat fittingWidth = [headerCell cellSizeForBounds:bounds].width; 

     if (fittingWidth > width) { 
      width = fittingWidth; 
     } 
    } 
    */ 
    for (NSInteger row = minRow; row < maxRow; row++) { 
     NSTableCellView *tableCellView = [tableView viewAtColumn:column row:row makeIfNecessary:YES]; 
     CGFloat   fittingWidth = [tableCellView fittingSize].width; 

     if (fittingWidth > width) { 
      width = fittingWidth; 

      if (width >= maxWidth) { 
       break; 
      } 
     } 
    } 

    return MIN(maxWidth, width); 
}