NSClipView 边界 - 找出滚动位置的问题



当用户滚动到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)
}

如果我在滚动视图的顶部,打印结果如下所示:

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。这种差异从何而来?

我通过

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

clipView.documentVisibleRect就是这样,你真正能看到的。当然我不能使用这部分的高度值。原点值告诉我滚动视图中的位置。

总内容的高度是如此必要。因此,我必须使用clipView.documentRect.

现在非常简单:如果 ableRects y 位置 + 可见矩形的高度与总剪辑视图的高度相同,我们就在最后。此代码有效:

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

最新更新