当用户滚动到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。这种差异来自何处?
答案 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")
}
}