自定义NSScrollView不会滚动NSTableHeaderView

时间:2011-06-02 13:05:27

标签: objective-c cocoa nstableview nsscrollview

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

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

当我执行此操作时,NSTableView滚动正常,但其关联的NSTableHeaderView不会随之移动。但是,如果我使用鼠标并正常滚动NSScrollView,它们会像他们应该一样移动。

我想我可能只是错过了一条线,让NSTableHeaderView知道它应该滚动,但我不知道那是什么。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:2)

好吧,当你用鼠标滚动包含NSScrollView的{​​{1}}时,我不确切知道引擎盖下是什么类型的黑魔法,但看起来它在某处内部处理它。为了避免这种情况,我现在以编程方式滚动NSTableHeaderView(通过覆盖将处理用户输入的函数),然后我自己滚动NSTableView,如下所示:< / p>

NSTableHeaderView

答案 1 :(得分: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)
        }
    }
}