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
когда пришло время отрегулировать высоту строк, что заставит таблицу вызывать этот метод для каждой из видимых ячеек и, следовательно, выполнить изменение размера.
Я уверен, что этот метод делегата вызывается только при перезагрузке данных ячейки таблицы, а не во время других событий, таких как изменение границ.
Вам нужно будет вызвать перезагрузку, когда пришло время настроить высоту строк, что приведет к тому, что таблица вызовет этот метод для каждой из видимых ячеек и, следовательно, выполнит изменение размера.