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)
对于基于视图的表视图(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)
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)
我发现以下内容适合我(用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)
给定列的标识符作为参数,它会在该列中找到内容最长的单元格,并调整列的大小以适合该内容.
| 归档时间: |
|
| 查看次数: |
13671 次 |
| 最近记录: |