NSClipView bounds - проблемы с поиском позиции прокрутки - PullRequest
0 голосов
/ 17 апреля 2019

Я пытаюсь выяснить, когда пользователь прокручивает до конца NSTableView. Поэтому, конечно, табличное представление встраивается как обычно в NSClipView, а в NSScrollView. Больше нет изменений, кроме факта добавления вставок в ClipView (вверху: 20, слева / справа: 20, внизу: 0).

Чтобы получить уведомление о прокрутке, я подключил розетку NSClipView.

Поэтому я использую этот код:

self.clipView.postsBoundsChangedNotifications = true
NotificationCenter.default.addObserver(self,
                                       selector: #selector(scrollViewDidScroll(notification:)),
                                       name: NSView.boundsDidChangeNotification,
                                       object: self.clipView)

...

@objc func scrollViewDidScroll(notification: Notification) {
    print("\(self.clipView.contentInsets.bottom) - \(self.clipView.contentInsets.top)")
    print(self.clipView.bounds)
}

Если я нахожусь на вершине ScrollView, результаты печати выглядят так:

0.0 - 20.0
(-20.0, -20.0, 600.0, 556.0)
// x      y    width  height

Мне кажется, это нормально. Но если я внизу, это выглядит так:

0.0 - 20.0
(-20.0, 595.0, 600.0, 556.0)

В моем понимании значение y должно быть 536, а не 595. Откуда эта разница?

1 Ответ

0 голосов
/ 17 апреля 2019

Я нашел решение своим путем, наблюдая различные значения, особенно после изменения размера окна.Итак:

clipView.documentVisibleRect - это то, что вы действительно можете видеть.Конечно, я не могу использовать значение высоты этой части.Исходное значение говорит мне о позиции в ScrollView.

Так необходима высота всего содержимого.Поэтому я должен использовать clipView.documentRect.

Теперь это очень просто: если положение y в visibleRects + высота видимого прямоугольника совпадает с высотой всего клипа, мы находимся в конце.Этот код работает:

@objc func scrollViewDidScroll(notification: Notification) {
    let scrollY = self.clipView.documentVisibleRect.origin.y
    let visibleHeight = self.clipView.documentVisibleRect.size.height
    let totalHeight = self.clipView.documentRect.size.height

    if scrollY + visibleHeight >= totalHeight {
        print("end")
    }
}
...