Пользовательский NSScrollView не прокручивает NSTableHeaderView - PullRequest
1 голос
/ 02 июня 2011

У меня есть NSTableView, встроенный в пользовательский подкласс NSScrollView, в котором я иногда выполняю программную прокрутку, например:

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

Когда я делаю это, NSTableView прекрасно прокручивается, но связанный с ним NSTableHeaderView не перемещается вместе с ним. Если я использую мышь и прокручиваю NSScrollView как обычно, они двигаются вместе, как и должны.

Я полагаю, что я, вероятно, просто пропускаю где-то одну строку, которая сообщает NSTableHeaderView, что он тоже должен прокручиваться, но я не знаю, что это такое. Кто-нибудь может помочь?

Ответы [ 2 ]

2 голосов
/ 08 июня 2011

Ну, я не знаю точно, какая черная магия происходит под капотом, когда вы прокручиваете NSScrollView, содержащую NSTableHeaderView с помощью мыши, но похоже, что она где-то обрабатывает это внутренне.Чтобы обойти это, я теперь только прокручиваю NSTableView программно (переопределяя функции, которые будут обрабатывать пользовательский ввод), а затем я сам прокручиваю NSTableHeaderView, например:

NSTableHeader *header = [[self documentView] headerView];
[header setBoundsOrigin:NSMakePoint(newOffset.x,[header bounds].origin.y)];
0 голосов
/ 28 апреля 2019

Я столкнулся с той же проблемой в NSTableView на основе ячеек с Swift 5 / MacOS 14.

NSScrollView, включающий в себя NSTableView, владеет как ContentView, так и headerView NSTableView (и cornerView, который яне использовать), и обычно отвечает за координацию их прокрутки.

  • При прокрутке с помощью мыши внутренняя магия NSScrollView правильно обрабатывает прокрутку представления заголовка.
  • При программной прокруткеNSClipView с использованием scroll (to :) + refleScrolledClipView, 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)
        }
    }
}
...