NSClipView界限-查找滚动位置的问题

时间:2019-04-17 14:02:14

标签: cocoa nsscrollview

当用户滚动到NSTableView的末尾时,我试图找出答案。因此,当然,tableview像往常一样嵌入在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 :(得分:0)

我通过观察不同的值找到了解决方案,尤其是在调整窗口大小之后。所以:

clipView.documentVisibleRect是您真正看到的。当然我不能使用这部分的高度值。原点值告诉我有关ScrollView中的位置。

所以总含量的高度是必要的。因此,我必须使用clipView.documentRect

现在非常简单:如果visibleRects y位置+可见rect的高度与整个clipview的高度相同,那么我们就在最后。这段代码有效:

@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")
    }
}