gpt4 book ai didi

macos - 插入行时保持相同的 NSTableView 滚动位置

转载 作者:行者123 更新时间:2023-12-03 16:52:16 24 4
gpt4 key购买 nike

我有一个基于 View 的 NSTableView,显示消息/信息的时间线。行高是可变的。使用 insertRows 定期将新消息添加到表格顶部:

NSAnimationContext.runAnimationGroup({ (context) in
context.allowsImplicitAnimation = true
self.myTable.insertRows(at: indexSet, withAnimation: [.effectGap])
})

当用户停留在表格顶部时,消息会不断插入到顶部,从而将现有消息下推:这是此上下文中的常见行为。

一切正常,除了如果用户向下滚动,新插入的消息不应使表格滚动

我希望 tableView 在用户滚动或用户向下滚动时保持在原来的位置。

换句话说,如果顶行 100% 可见,则 tableView 只能被新插入的行下推。

我试图通过快速恢复其位置来给人一种 table 没有移动的错觉,如下所示:

// we're not at the top anymore, user has scrolled down, let's remember where
let scrollOrigin = self.myTable.enclosingScrollView!.contentView.bounds.origin
// stuff happens, new messages have been inserted, let's scroll back where we were
self.myTable.enclosingScrollView!.contentView.scroll(to: scrollOrigin)

但它的行为并不符合我的要求。我尝试了很多组合,但我认为我不理解剪辑 View 、 ScrollView 和表格 View 之间的关系。

或者也许我处于 XY 问题区域,并且有不同的方法来实现此行为?

最佳答案

忘记 ScrollView 、剪辑 View 、内容 View 、文档 View 并专注于表格 View 。 TableView 可见部分的底部不应移动。您可能错过了翻转的坐标系。

NSPoint scrollOrigin;
NSRect rowRect = [self.tableView rectOfRow:0];
BOOL adjustScroll = !NSEqualRects(rowRect, NSZeroRect) && !NSContainsRect(self.tableView.visibleRect, rowRect);
if (adjustScroll) {
// get scroll position from the bottom: get bottom left of the visible part of the table view
scrollOrigin = self.tableView.visibleRect.origin;
if (self.tableView.isFlipped) {
// scrollOrigin is top left, calculate unflipped coordinates
scrollOrigin.y = self.tableView.bounds.size.height - scrollOrigin.y;
}
}

// insert row
id object = [self.arrayController newObject];
[object setValue:@"John" forKey:@"name"];
[self.arrayController insertObject:object atArrangedObjectIndex:0];

if (adjustScroll) {
// restore scroll position from the bottom
if (self.tableView.isFlipped) {
// calculate new flipped coordinates, height includes the new row
scrollOrigin.y = self.tableView.bounds.size.height - scrollOrigin.y;
}
[self.tableView scrollPoint:scrollOrigin];
}

我没有测试“当用户滚动时,tableView 保持在原来的位置”。

关于macos - 插入行时保持相同的 NSTableView 滚动位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41965201/

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