Objective c 自定义NSScrollView不';t滚动NSTableHeaderView
我在自定义的Objective c 自定义NSScrollView不';t滚动NSTableHeaderView,objective-c,cocoa,nstableview,nsscrollview,Objective C,Cocoa,Nstableview,Nsscrollview,我在自定义的NSScrollView子类中嵌入了一个NSTableView,其中我有时会以编程方式进行滚动,如下所示: [[self contentView] scrollToPoint:newOffset]; [self reflectScrolledClipView:[self contentView]]; NSTableHeader *header = [[self documentView] headerView]; [header setBoundsOrigin:NSMakePoin
NSScrollView
子类中嵌入了一个NSTableView
,其中我有时会以编程方式进行滚动,如下所示:
[[self contentView] scrollToPoint:newOffset];
[self reflectScrolledClipView:[self contentView]];
NSTableHeader *header = [[self documentView] headerView];
[header setBoundsOrigin:NSMakePoint(newOffset.x,[header bounds].origin.y)];
执行此操作时,NSTableView
滚动良好,但其关联的NSTableHeaderView
不会随之移动。但是,如果我正常使用鼠标滚动NSScrollView
,它们会像应该的那样一起移动
我想我可能只是在某个地方漏掉了一行,让
NSTableHeaderView
知道它也应该滚动,但我不知道那是什么。有人能帮忙吗?好吧,我不知道当你用鼠标滚动一个包含NSTableHeaderView
的NSScrollView时,引擎盖下到底发生了什么样的黑魔法,但它看起来像是在某个地方内部处理的。为了避免这种情况,我现在只以编程方式滚动NSTableView
(通过覆盖处理用户输入的函数),然后我自己滚动NSTableHeaderView
,如下所示:
[[self contentView] scrollToPoint:newOffset];
[self reflectScrolledClipView:[self contentView]];
NSTableHeader *header = [[self documentView] headerView];
[header setBoundsOrigin:NSMakePoint(newOffset.x,[header bounds].origin.y)];
我在使用Swift 5/MacOS 14的基于cell的NSTableView上遇到了同样的问题
包含NSTableView的NSScrollView同时拥有NSTableView的contentView和headerView(以及我不使用的cornerView),并且通常负责协调它们的滚动
- 当使用鼠标滚动时,NSScrollView内部魔术手柄可正确控制标题视图的滚动
- 使用scroll(to:)+reflectScrolledClipView以编程方式滚动NSClipView时,NSScrollView无法滚动headerView
我使用此协议也是为了以编程方式滚动headerView,这允许我使用此协议以编程方式滚动:
extension NSTableView : ScrollingProtocol {
func getScrollView() -> NSScrollView? {
return enclosingScrollView
}
func getVisibleOrigin() -> NSPoint? {
return enclosingScrollView?.documentVisibleRect.origin
}
func scrollToOrigin(_ targetOrigin: NSPoint) {
guard let currentOrigin = getVisibleOrigin(),
let scrollView = enclosingScrollView
else { return }
if (!NSEqualPoints(targetOrigin, currentOrigin)) {
let clipView = scrollView.contentView
clipView.scroll(to: targetOrigin)
// Workaround because NSClipView.scroll(to:) does not scroll
// the headerView of NSTableView
if let headerView = headerView {
let x = targetOrigin.x
let y = headerView.bounds.origin.y
if let headerClipView = headerView.superview as? NSClipView {
headerClipView.scroll(to: NSMakePoint(x, y))
}
}
scrollView.reflectScrolledClipView(clipView)
}
}
}
您是否尝试过使用-documentView
而不是-contentView
。它不起作用P不过,老实说,用-documentView
而不是-contentView
没有多大意义-documentView
返回NSTableView
,而-contentView
返回NSClipView
。在这种情况下,我非常确定我需要NSClipView
。黑魔法在于NSScrollView检查文档视图中的“headerView”方法/属性,如果找到,就会这样处理。在我能找到的任何地方都没有记录,除了以下邮件列表: