gpt4 book ai didi

objective-c - 默认[NSTableViewDelegate tableView :sizeToFitWidthOfColumn:] doesn't get called

转载 作者:行者123 更新时间:2023-12-03 17:21:12 25 4
gpt4 key购买 nike

根据Apple's documentation on [NSTableViewDelegate tableView:sizeToFitWidthOfColumn:] :

By default, NSTableView iterates every row in the table, accesses a cell via preparedCellAtColumn:row:, and requests the cellSize to find the appropriate largest width to use.

For accurate results and performance, it’s recommended that this method is implemented when using large tables. By default, large tables use a monte carlo simulation instead of iterating every row.

这个默认行为正是我想要的,所以我选择不在我的 NSTableViewDelegate 中实现这个方法。但是,当我双击列的调整大小分隔线时,没有任何反应。我的表格 View 是基于 View 的。

最佳答案

从 OS X 10.10.2 开始,双击列分隔符时,基于 View 的表格 View 中的列仍然不会自动调整大小。

我实现了委托(delegate)来采样可见矩形的行以及下方和上方的 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);
}

关于objective-c - 默认[NSTableViewDelegate tableView :sizeToFitWidthOfColumn:] doesn't get called,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26941266/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com