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

时间:2010-12-19 20:56:42

标签: cocoa nsmatrix 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];

感谢

3 个答案:

答案 0 :(得分:0)

试试这个:

NSBrowser *browser; //Browser containing columns
NSInteger index; //Index of column to resize
[[browser matrixInColumn:index] sizeToCells];

或者,如果您想调整整个浏览器的大小,可以尝试:

[browser sizeToFit];

答案 1 :(得分:0)

我无法找到一个方便的解决方案,但我实施了一个运行良好的系统:

  1. 保留一个可变的列宽数组。
  2. 实施browser:willDisplayCell:atRow:column:委托方法。
  3. 向表中添加新内容时,请将新列索引处的列宽数组的值设置为0.
  4. 调用willDisplayCell委托时,计算每个单元格的宽度。对于NSTextFieldCells,我使用了:CGFloat cellWidth = [((NSTextFieldCell *)cell).attributedStringValue size].width + 40.0f;
  5. 如果计算的单元格宽度大于存储的列宽,请将存储的值设置为cellWidth,并使用新值调用NSBrowser的setWidth:forColumn:

答案 2 :(得分:0)

Swift 3的更新:

尽管这是一个老问题,但这个问题仍然具有相关性,只能部分回答。 Josh的上述答案非常好,但我认为没有必要保持额外的列宽。我做的就是:

  1. 向浏览器添加操作处理程序:

    browser.action = #selector(BrowserController.selectionChanged)

  2. 在selectionChanged中,将列宽重置为默认值:

        // don't resize column 0
        for i in 1 ... self.browser.lastVisibleColumn {
            self.browser.setWidth(self.browser.defaultColumnWidth(), ofColumn:i)
        }
    
    1. 正如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)
          }
      
    2. 执行这两项操作将首先重置列,然后将其调整为最大行的大小。