NSOutlineView с ячейками для переноса текста: heigthOfRow

Я пытаюсь реализовать NSOutlineView с многострочными ячейками.

Следуя советам этого и других сайтов, я предложил следующий код в делегате представления.

- (CGFloat)outlineView:(NSOutlineView *)outlineView heightOfRowByItem:(id)item {
    NSTableColumn *column = [outlineView outlineTableColumn];
    NSCell *cell = [column dataCell];

    [cell setStringValue:[item valueForKey:@"label"]];

    return [cell cellSizeForBounds:NSMakeRect(0.0, 0.0, [column width], CGFLOAT_MAX)].height;
}

Ячейка в столбце таблицы структуры установлена ​​на перенос.

Я получаю, однако, странное графическое поведение - текстовые строки перекрываются, как видно на http://screencast.com/t/ewJUwRmlGZqh. Кажется, что ячейка приобретает правильный размер, но не отталкивает нижележащие ячейки.

Может ли кто-нибудь помочь мне?

2 ответа

(Это было опубликовано в качестве предлагаемого изменения, но должно было быть ответом само по себе. Я не знаю, имеет ли это смысл или нет. @Asavartsov: не стесняйтесь опубликовать этот ответ как свой собственный, и оставьте мне комментарий, чтобы Я удалю эту копию.)

Этот делегат вызывался всякий раз, когда кто-то спрашивал высоту строки в элементе. Это происходит, в частности, при операциях рисования, которые следуют за изменением границ. Но, как указано в документации,

NSTableView может кэшировать значения, которые возвращает этот метод, поэтому, если вы хотите изменить высоту строки, убедитесь, что вы сделали недействительной высоту строки, вызвав noteHeightOfRowsWithIndexesChanged:, NSTableView автоматически аннулирует весь кэш высоты строки в reloadData а также noteNumberOfRowsChanged,

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

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

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

Другие вопросы по тегам