gpt4 book ai didi

objective-c - 在基于 View 的 NSTableView 上正确调整行的大小

转载 作者:太空狗 更新时间:2023-10-30 03:28:43 24 4
gpt4 key购买 nike

具有动态高度的行的基于 View 的 NSTableView 在 TableView 大小更改时不会调整其行的大小。当行高来自 TableView 的宽度时,这是一个问题(想想填充列并换行从而扩展行大小的文本 block )。

我一直在尝试让 NSTableView 在它改变大小时调整其行的大小,但收效甚微:

  • 如果我通过查询 enumerateAvailableRowViewsUsingBlock: 仅调整可见行的大小,一些不可见行不会调整大小,因此当用户滚动并显示这些行时,它们会以旧高度显示.
  • 如果我调整所有行的大小,当有很多行时,速度会明显变慢(在我的 1.8Ghz i7 MacBook Air 中,每次调整 1000 行窗口大小时大约延迟 1 秒)。

有人可以帮忙吗?

这是我检测 TableView 大小变化的地方 - 在 TableView 的委托(delegate)中:

- (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有些相关但更专注于响应 TableView 的大小变化。

最佳答案

我刚刚遇到了这个确切的问题。我所做的是监视 ScrollView 内容 View 的 NSViewBoundsDidChangeNotification

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(scrollViewContentBoundsDidChange:) name:NSViewBoundsDidChangeNotification object:self.scrollView.contentView];

在处理程序中,获取可见行并调用 noteHeightOfRowsWithIndexesChange:。我在执行此操作时禁用了动画,因此用户不会在 View 进入表时在调整大小时看到行摆动

- (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];
}

这必须快速执行,这样表格才能很好地滚动,但对我来说效果很好。

关于objective-c - 在基于 View 的 NSTableView 上正确调整行的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12067018/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com