我正在使用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];
感谢
答案 0 :(得分:0)
试试这个:
NSBrowser *browser; //Browser containing columns
NSInteger index; //Index of column to resize
[[browser matrixInColumn:index] sizeToCells];
或者,如果您想调整整个浏览器的大小,可以尝试:
[browser sizeToFit];
答案 1 :(得分:0)
我无法找到一个方便的解决方案,但我实施了一个运行良好的系统:
browser:willDisplayCell:atRow:column:
委托方法。willDisplayCell
委托时,计算每个单元格的宽度。对于NSTextFieldCells,我使用了:CGFloat cellWidth = [((NSTextFieldCell *)cell).attributedStringValue size].width + 40.0f;
cellWidth
,并使用新值调用NSBrowser的setWidth:forColumn:
。答案 2 :(得分:0)
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)
}
执行这两项操作将首先重置列,然后将其调整为最大行的大小。