1

NSTableView在自定义子类中嵌入了一个NSScrollView,有时我会以编程方式滚动,如下所示:

[[self contentView] scrollToPoint:newOffset];
[self reflectScrolledClipView:[self contentView]];

当我这样做时,NSTableView滚动很好,但它的关联NSTableHeaderView不会随之移动。但是,如果我使用鼠标并NSScrollView正常滚动,它们会像应有的那样一起移动。

我想我可能只是在某处遗漏了一条线,让人们NSTableHeaderView知道它也应该滚动,但我不知道那是什么。任何人都可以帮忙吗?

4

2 回答 2

2

NSScrollView好吧,我不知道当你用鼠标滚动一个包含 an时,引擎盖下到底发生了什么样的黑魔法NSTableHeaderView,但它看起来像是在某个地方内部处理它。为了避免这种情况,我现在以编程方式滚动NSTableView(通过覆盖将处理用户输入的函数),然后我NSTableHeaderView自己滚动,如下所示:

NSTableHeader *header = [[self documentView] headerView];
[header setBoundsOrigin:NSMakePoint(newOffset.x,[header bounds].origin.y)];
于 2011-06-08T16:13:01.453 回答
0

我在使用 Swift 5 / MacOS 14 的基于单元的 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)
        }
    }
}
于 2019-04-28T20:42:43.760 回答