正确调整视图上的行大小
具有动态高度的行的基于视图的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的NSTableView有些相关,它们的行具有动态高度,但更多地专注于响应表视图的大小更改。
我刚刚经历了这个确切的问题。 我所做的是监视滚动视图的内容视图的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];
}
这必须迅速执行,所以桌子很好地滚动,但它的工作对我来说非常好。
链接地址: http://www.djcxy.com/p/49961.html