调整NSBrowser列的大小以适应内容的宽度

我正在使用NSBrowser(10.6SDK / Cocoa应用程序),我想向浏览器列发送一条消息,使其调整宽度以匹配该列中最大单元格的宽度。 在概念上似乎很基本,即使应该有一个方法,但没有。 这里有人解决这个问题吗?你是怎么解决的?代码示例? //更新 我添加了drop-support。代码有效,但列中的新项目不适合(有椭圆)。
-(BOOL) browser:(NSBrowser *)browser acceptDrop:(id <NSDraggingInfo>)info atRow:(NSInteger)row column:(NSInteger)column dropOperation:(NSBrowserDropOperation)dropOperation
 {
NSPasteboard* pboard = [info draggingPasteboard];
NSData* rowData = [pboard dataForType:CMCourseDataType];
NSIndexSet* rowIndexes = [NSKeyedUnarchiver unarchiveObjectWithData:rowData];

NSArray *selectedCourses = [[self coursesArrayController] selectedObjects];
Group *selectedGroup = [[self allGroupsArray] objectAtIndex:row];

[selectedGroup addCourses:[NSSet setWithArray:selectedCourses]];
[browser reloadColumn:1];
/ *下面尝试了新代码,导致第1列调整其宽度,但它们没有影响* /
[browser sizeToFit];
[[browser matrixInColumn:1] sizeToCells];   
在awakeFromNib中,我设置:
[browser setColumnResizingType:NSBrowserUserColumnResizing];
谢谢     
已邀请:
试试这个:
NSBrowser *browser; //Browser containing columns
NSInteger index; //Index of column to resize
[[browser matrixInColumn:index] sizeToCells];
或者,如果要调整整个浏览器的大小,可以尝试:
[browser sizeToFit];
    
我无法找到一个方便的解决方案,但我实现了一个相当好的系统: 保持可变的列宽数组。 实现
browser:willDisplayCell:atRow:column:
委托方法。 向表中添加新内容时,请将新列索引处的列宽数组的值设置为0。 当调用
willDisplayCell
委托时,计算每个单元格的宽度。对于NSTextFieldCells,我用过:
CGFloat cellWidth = [((NSTextFieldCell *)cell).attributedStringValue size].width + 40.0f;
如果计算的单元格宽度大于存储的列宽,请将存储的值设置为
cellWidth
,并使用新值调用NSBrowser的
setWidth:forColumn:
。     
Swift 3更新: 即使这是一个老问题,这个问题仍然是相关的,只能部分回答。 Josh上面的回答非常好,但我认为没有必要保持额外的列宽数组。我做的是解决这个问题: 向浏览器添加动作处理程序: browser.action = #selector(BrowserController.selectionChanged) 在selectionChanged中,将列宽重置为默认值:
    // don't resize column 0
    for i in 1 ... self.browser.lastVisibleColumn {
        self.browser.setWidth(self.browser.defaultColumnWidth(), ofColumn:i)
    }
正如Josh所提到的那样,实现浏览器:willDisplayCell:atRow:column:method。在该方法中,使用一点填充将列调整为其中的最大行:
    let colWidth = browser.frame(ofColumn: column).size.width //current width

    if cell.cellSize.width + 15 > colWidth { //cell is the current cell in the delegate method 
        browser.setWidth(fscell.cellSize.width + 15, ofColumn: column)
    }
执行这两项操作将首先重置列,然后将其调整为最大行的大小。     

要回复问题请先登录注册