在变化

时间:2017-02-24 20:07:21

标签: swift cocoa nstableview nsscrollview nscell

我有一个NSTableView,想要在用户滚动tableView时跟踪其包含NSCell的位置。

我找不到任何有用的东西。如果有人能引导我走向正确的方向,那就太棒了!

修改

感谢 @Ken Thomases @Code Different ,我刚刚意识到我正在使用基于视图的tableView,使用tableView(_ tableView:viewFor tableColumn:row:),它返回一个的NSView。

但是,NSView本质上是一个NSCell。

let cell = myTableView.make(withIdentifier: "customCell", owner: self) as! MyCustomTableCellView // NSTableCellView

所以我真的希望我最初的问题不会产生误导。我仍然在寻找一种方法如何跟踪单个细胞/视图的位置

我在IB中将NSScrollView(包含tableView)的行为设置为Copy on Scrollenter image description here

但是当我检查视图/单元格frame的x和y(在我的MyCustomTableCellView子类的viewWillDraw内)时,它仍为0, 0

3 个答案:

答案 0 :(得分:1)

根据编辑过的问题更新:

首先,只是让您意识到,NSTableCellView不是NSCell,也不是它的子类。当您使用基于视图的表时,您没有使用NSCell作为单元格视图。

此外,视图frame始终与其直接超级视图的界限相关。这不是一个绝对的立场。并且单元格视图的超级视图不是表视图也不是滚动视图。单元格视图位于行视图中。这就是为什么您的单元格查看原点是0,0。

您可以使用NSTableView' s frameOfCell(atColumn:row:)来确定给定单元格视图在表格视图中的位置。不过,我仍然认为这不是一个好方法。请参阅我原来答案的最后一段,如下:

原始答案:

表格视图不包含""你似乎在思考一堆NSCell。此外,NSCell没有职位。基于NSCell的复合视图的重点在于它们比为每个单元格使用单独对象的体系结构重量轻得多。

通常,每个表列都有一个NSCell。当表格视图需要在列中绘制单元格时,它会使用一个单元格的数据配置该列NSCell并告诉它在该单元格的位置绘制。然后,它使用下一个单元格的数据配置相同的NSCell,并告诉它在下一个位置绘制。等

要执行您想要的操作,您可以将滚动视图配置为不在滚动时复制。然后,每当滚动时,将要求表视图绘制所有内容。然后,您将实现tableView(_:willDisplayCell:for:row:)委托方法并将alpha值应用于滚动视图顶部和底部边缘的单元格。

但这可能不是一个好方法。

我认为通过向滚动视图中添加部分透明的浮动子视图可以获得更好的运气,在背景颜色中具有从完全不透明到完全透明的渐变。因此,不是细胞淡出并让背景显示出来,而是在顶部放置另一个视图,只让部分细胞显示出来。

答案 1 :(得分:1)

UIImage不使用委托。它使用通知中心通知观察者发生了变化。下面的解决方案假定垂直滚动。

NSScrollView

结果:

https://stackoverflow.com/a/24979595/300224

答案 2 :(得分:0)

我刚刚解决了这个问题。

只需将内容视图postsBoundsChangedNotifications设置为true,然后将观察者添加到NSViewBoundsDidChange的NotificationCenter。像魅力一样工作!