мне нужна небольшая помощь с NSTableView и динамической высотой строкиВид на основе NSTableView, делает высоту строки зависит от содержания
Что у меня есть:
один столбец вид на основе NSTableView, связанную с контроллер массива. Каждый NSTableCellView содержит три подзаголовка: NSImageView, NSTextField (одна строка) и NSTextField (многострочный). В принципе, это интерфейс чата, поэтому у вас будет список сообщений, отправителей и аватаров.
То, что я хочу добиться:
Если текст длиннее, чем минимальная высота строки, строка расширяется, чтобы соответствовать содержанию. Как и iMessage, пузырьки расширяются, чтобы соответствовать сообщению.
... что кажется очень естественным делом, но из всех соответствующих решений, которые я нашел в Интернете, (Ref 1, Ref 2), ни одна из которых не работает для меня.
Реф 2 выглядит фантастически написанным, но ничто из этого не применимо к моему приложению, поскольку в примере проекта используется сторонний код автомаркета, и все это предназначено для iOS. В Ref 1 дано очень многообещающее решение, написанное на английском языке. Я попытался настроить его, используя «фиктивный вид», как описано в решении, но не смог правильно изменить и измерить высоту.
Вот мой код для tableView:heightOfRow:
, _samplingView
- это фиктивный вид, который имеет рабочие ограничения и идентичен таковому в tableView
.
- (CGFloat)tableView:(NSTableView *)tableView heightOfRow:(NSInteger)row
{
NSTextField *textField;
NSTextFieldCell *messageCell;
for (NSView *subview in [_samplingView subviews]) {
if ([[subview identifier] isEqualToString:@"message"]) {
textField = (NSTextField*)subview;
messageCell = ((NSTextField*)subview).cell;
}
}
Message *message = [[_messagesArrayController arrangedObjects] objectAtIndex:row];
_samplingView.objectValue = message;
CGFloat width = [[[tableView tableColumns] objectAtIndex:1] width];
[_samplingView setBounds:NSMakeRect(0, 0, width, CGFLOAT_MAX)];
[_samplingView display];
CGFloat optimalHeight = 10 + [messageCell cellSize].height; //messageCell's size stays the same when I change samplingView to try to measure the height
return optimalHeight;
}
Результат: все высоты строк остаются такими же, как-то, когда я изменить ширину _samplingView
, она не изменить размер messageCell
«ы размера. Я думал, что автоматическая компоновка позаботится об этом сжатии/расширении и позволит мне измерять высоту. В самом деле, я очень смущен.
Edit: для справки, это то, что мой взгляд выглядит
+-----------+---------------------------------------------------+
| | NSTextField |
|NSImageView| sender |
| avatar +---------------------------------------------------+
| | |
| | NSTextField (multiline) |
+-----------| message |
| | |
| | (high compression/hugging priority) |
| | (this view should decide the height of row) |
| | |
+-----------+---------------------------------------------------+
Вы когда-нибудь находили решение этого вопроса? –
@Jai, я взял удар. – stevesliva