我需要NSTableView的和动态的行高一点点帮助基于视图的NSTableView的,让行高度依赖于内容
我有什么:基于视图
单列NSTableView的绑定到阵列控制器。每个NSTableCellView包含三个子视图:NSImageView,NSTextField(单行)和NSTextField(多行)。基本上,这是一个聊天界面,所以你会有一个消息,发件人和头像列表。
我想要什么来实现的:
当文本比该行的最小高度更长的时间,该行扩展以适应内容。就像iMessage一样,气泡也会扩展以适应消息。
......这似乎是一件非常自然的事情,但在我找到的所有相关解决方案中,(Ref 1,Ref 2),其中没有一个适合我。
参考文献2看起来飞驰的书面但没有适用于我的应用程序,因为示例项目使用第三方自动布局代码和整个事情是专为iOS。参考文献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
的大小。我认为自动布局会照顾这种压缩/扩展,并允许我测量高度。的确,我很困惑。
编辑:供参考,这是我的看法是什么样子
+-----------+---------------------------------------------------+
| | NSTextField |
|NSImageView| sender |
| avatar +---------------------------------------------------+
| | |
| | NSTextField (multiline) |
+-----------| message |
| | |
| | (high compression/hugging priority) |
| | (this view should decide the height of row) |
| | |
+-----------+---------------------------------------------------+
你有没有找到解决方案? –
@Jai,我刺伤了它。 – stevesliva