Измените размер столбца NSBrowser, чтобы он соответствовал ширине содержимого. - PullRequest
1 голос
/ 19 декабря 2010

Я использую NSBrowser (приложение 10.6SDK / Cocoa) и хочу отправить сообщение в столбец браузера, который изменит свой размер в соответствии с шириной самой большой ячейки в этом столбце.

Кажется довольно базовым в концепции, хотя для этого должен быть метод, но нет.

Кто-нибудь здесь занимался этим раньше? Как ты это решил? Пример кода?

// Обновление Я добавил дроп-поддержку. Код работает, но новый элемент в столбце не помещается (имеет эллипс).

-(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 голосов
/ 22 января 2015

Мне не удалось найти удобное решение для этого, но я реализовал систему, которая работает довольно хорошо:

  1. Сохранять изменяемый массив ширины столбцов.
  2. Реализация метода делегата browser:willDisplayCell:atRow:column:.
  3. Когда вы добавляете новое содержимое в таблицу, установите значение массива ширины столбца в индексе нового столбца равным 0.
  4. Когда вызывается делегат willDisplayCell, вычислите ширину для каждой ячейки. Для NSTextFieldCells я использовал: CGFloat cellWidth = [((NSTextFieldCell *)cell).attributedStringValue size].width + 40.0f;
  5. Если вычисленная ширина ячейки превышает ширину сохраненного столбца, установите для сохраненного значения значение cellWidth и вызовите setWidth:forColumn: вашего NSBrowser с новым значением.
0 голосов
/ 17 ноября 2016

Обновление для Swift 3:

Несмотря на то, что это старый вопрос, этот вопрос все еще актуален и получил лишь частичный ответ. Ответ Джоша выше довольно хорош, но я не думаю, что необходимо поддерживать дополнительный массив ширины столбцов. Что я сделал, чтобы решить это:

  1. добавить обработчик действий в браузер:

    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)
    }
  1. как упоминает Джош, реализуйте браузер: willDisplayCell: atRow: column: метод. В этом методе измените размер столбца до самой большой строки в нем с небольшим отступом:

        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)
        }
    

Выполнение этих двух действий сначала сбросит столбец, а затем изменит его размер до размера самой большой строки.

0 голосов
/ 20 декабря 2010

Попробуйте это:

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

Или, если вы хотите изменить размер всего браузера, вы можете попробовать:

[browser sizeToFit];
...