NSTableColumn大小适合内容

Dov*_*Dov 11 macos user-interface cocoa objective-c nstableview

我正在开发和反对Mac OS X 10.6(Snow Leopard).当我在我的两个NSTableView列标题之间双击时,左侧的列会自动调整大小,就像您期望的那样.

我想在上下文菜单中提供这个,但似乎没有可公开访问的功能来执行此操作.我用谷歌搜索过,看了NSTableView,NSTableHeaderView和NSTableColumn的文档,但什么也没找到.我发现很难相信当他们明显编写代码时,他们不会暴露出如此有用的东西.

我看到了这个-[NSTableColumn sizeToFit]方法,但只考虑了标题的大小.我也愿意将双击事件发送到NSTableHeaderView,但也无法弄清楚如何做到这一点.

更新 - 我意识到重要的是要提到我有一个NSArrayController(子类)向我的表提供数据,所以我没有NSTableViewDataSource我可以调用的-[tableView: objectValueForTableColumn: row:].这就是问题的症结所在:每个列都绑定到数组控制器的一个键路径,这就是它获取数据的方式,因此无法遍历其内容.

Rai*_*bir 10

您可以通过从列中获取单元格来获取每个单元格的长度.

NSCell myCell = [column dataCellForRow:i];
Run Code Online (Sandbox Code Playgroud)

然后获得单元格的宽度.

width = [myCell cellSize].width;
Run Code Online (Sandbox Code Playgroud)

之后,您可以将单元格的宽度设置为列的宽度.

[column setMinWidth:width];
[column setWidth:width];
Run Code Online (Sandbox Code Playgroud)

  • Apple的自动调整方法使用`[NSTableView preparedCellAtColumn:row:]`而不是`[NSTableColumn dataCellForRow:]`.此外,如果表具有大量行,则它们会随机对表进行采样,而不是遍历所有行.(请参阅表视图委托方法`tableView:sizeToFitWidthOfColumn:`的文档) (3认同)

Ale*_*ubo 6

对于基于视图的表视图(OS X 10.7和更高版本),您必须使用该NSTableView方法viewAtColumn:row:makeIfNecessary:,然后获取大小.

如果单元格视图是以下代码,则以下代码可用NSTextField.对于其他视图,您必须找出获得最小尺寸的方法.

[tableView.tableColumns enumerateObjectsUsingBlock:
    ^(id obj, NSUInteger idx, BOOL *stop) {
        NSTableColumn* column = (NSTableColumn*) obj;
        CGFloat width = 0;
        for (int row = 0; row < tableView.numberOfRows; row++) {
            NSView* view = [tableView viewAtColumn: idx
                row: row
                makeIfNecessary: YES];
            NSSize size = [[view cell] cellSize];
            width = MAX(width, MIN(column.maxWidth, size.width));
        }
        column.width = width;
    }];
}
Run Code Online (Sandbox Code Playgroud)


use*_*798 6

NSTableColumn上的以下类别将列重新调整为双击分隔符将产生的相同宽度.

@implementation NSTableColumn (resize)

- (void) resizeToFitContents
{
    NSTableView * tableView = self.tableView;
    NSRect rect = NSMakeRect(0,0, INFINITY, tableView.rowHeight);
    NSInteger columnIndex = [tableView.tableColumns indexOfObject:self];
    CGFloat maxSize = 0;
    for (NSInteger i = 0; i < tableView.numberOfRows; i++) {
        NSCell *cell = [tableView preparedCellAtColumn:columnIndex row:i];
        NSSize size = [cell cellSizeForBounds:rect];
        maxSize = MAX(maxSize, size.width);
    }
    self.width = maxSize;
}

@end
Run Code Online (Sandbox Code Playgroud)


P.M*_*.M. 6

我发现以下内容适合我(用Swift编写):

func resizeColumn(columnName: String) {
    var longest:CGFloat = 0 //longest cell width
    let columnNumber = tableView.columnWithIdentifier(columnName)
    let column = tableView.tableColumns[columnNumber] as! NSTableColumn
    for (var row = 0; row < tableView.numberOfRows; row++) {
        var view = tableView.viewAtColumn(columnNumber, row: row, makeIfNecessary: true) as! NSTableCellView
        var width = view.textField!.attributedStringValue.size.width

        if (longest < width) {
            longest = width
        }
    }

    column.width = longest
    viewTable.reloadData()
}
Run Code Online (Sandbox Code Playgroud)

给定列的标识符作为参数,它会在该列中找到内容最长的单元格,并调整列的大小以适合该内容.