自定义NSScrollView不会滚动NSTableHeaderView

问题描述 投票:1回答:2

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

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

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

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

objective-c cocoa nstableview nsscrollview
2个回答
2
投票

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

NSTableHeader *header = [[self documentView] headerView];
[header setBoundsOrigin:NSMakePoint(newOffset.x,[header bounds].origin.y)];

0
投票

我在使用Swift 5 / MacOS 14的基于单元的NSTableView上遇到了同样的问题。

包含NSTableView的NSScrollView拥有contentView和NSTableView的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)
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.