具有动态高度的行的基于视图的NSTableView
在更改表视图大小时不会调整其行的大小。当行高度从表视图的宽度派生时,这是一个问题(想想填充列并包装因此扩展行大小的文本块)。
我一直试图让NSTableView
只要改变大小就调整行的大小,但却没有取得什么成功:
enumerateAvailableRowViewsUsingBlock:
仅调整可见行的大小,则某些不可见的行不会调整大小,因此当用户滚动并显示这些行时,会显示旧的高度。有人可以帮忙吗?
这是我检测表视图大小更改的位置 - 在表视图的委托中:
- (void)tableViewColumnDidResize:(NSNotification *)aNotification
{
NSTableView* aTableView = aNotification.object;
if (aTableView == self.messagesView) {
// coalesce all column resize notifications into one -- calls messagesViewDidResize: below
NSNotification* repostNotification = [NSNotification notificationWithName:BSMessageViewDidResizeNotification object:self];
[[NSNotificationQueue defaultQueue] enqueueNotification:repostNotification postingStyle:NSPostWhenIdle];
}
}
以下是上面发布的通知的处理程序,其中可见行的大小调整:
-(void)messagesViewDidResize:(NSNotification *)notification
{
NSTableView* messagesView = self.messagesView;
NSMutableIndexSet* visibleIndexes = [NSMutableIndexSet new];
[messagesView enumerateAvailableRowViewsUsingBlock:^(NSTableRowView *rowView, NSInteger row) {
if (row >= 0) {
[visibleIndexes addIndex:row];
}
}];
[messagesView noteHeightOfRowsWithIndexesChanged:visibleIndexes];
}
调整所有行大小的替代实现如下所示:
-(void)messagesViewDidResize:(NSNotification *)notification
{
NSTableView* messagesView = self.messagesView;
NSIndexSet indexes = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0,messagesView.numberOfRows)];
[messagesView noteHeightOfRowsWithIndexesChanged:indexes];
}
注意:此问题与View-based NSTableView with rows that have dynamic heights有些相关,但更侧重于响应表格视图的尺寸更改。
答案 0 :(得分:12)
我刚刚解决了这个问题。我所做的是监视NSViewBoundsDidChangeNotification的滚动视图的内容视图
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(scrollViewContentBoundsDidChange:) name:NSViewBoundsDidChangeNotification object:self.scrollView.contentView];
并在处理程序中,获取可见行并调用noteHeightOfRowsWithIndexesChange:。我在执行此操作时禁用动画,因此用户在调整大小期间看不到行摆动,因为视图进入表格
- (void)scrollViewContentBoundsDidChange:(NSNotification*)notification
{
NSRange visibleRows = [self.tableView rowsInRect:self.scrollView.contentView.bounds];
[NSAnimationContext beginGrouping];
[[NSAnimationContext currentContext] setDuration:0];
[self.tableView noteHeightOfRowsWithIndexesChanged:[NSIndexSet indexSetWithIndexesInRange:visibleRows]];
[NSAnimationContext endGrouping];
}
这必须快速执行,以便桌面滚动得很好,但它对我来说非常好。