如何在NSTableView上放置NSButton

时间:2013-04-02 20:03:14

标签: macos cocoa nstableview

Button with nothing behind it Table loaded Button with table behind it

1)按钮后面没有桌子 2)表格已加载 3)滚动后

如果我在NSTableView上放置一个按钮,滚动后会留下遗留物。有谁知道如何解决这个问题?

我目前的解决方案是将带有表格的部分拆分为2.下部是后台禁用的按钮。

My solution for now

3 个答案:

答案 0 :(得分:0)

我有类似的问题并解决了它,请参阅Why does an NSTextField leave artifacts over an NSTableView when the table scrolls?。基本上OSX将绘制表的内容并让父滚动视图移动缓存的内容,从而避免重绘是高效的。通过子类化父滚动视图,可以强制它刷新挂钩reflectScrolledClipView:方法的表。然后,每个卷轴将重新绘制整个表格,包括叠加层。

答案 1 :(得分:0)

尝试使用NSScrollView方法 - (void)addFloatingSubview:(NSView *)view forAxis:(NSEventGestureAxis)axis 所有tableviews通常都应该在ScrollView中。

答案 2 :(得分:0)

这是因为滚动视图设置为在滚动时复制其内容,并仅重新绘制新发现的部分作为性能优化。要关闭它,请使用

myTableView.enclosingScrollView.contentView.copiesOnScroll = NO;

虽然这会让滚动使用更多CPU(你也可以在XIB中执行此操作,查找'滚动副本'复选框)。

可能更好的方法是将滚动视图和按钮切换为图层支持:

myTableView.enclosingScrollView.wantsLayer = YES;
myButtonView.wantsLayer = YES;

(同样,您可以在XIB文件的“图层”检查器中设置此项,您可以在其中单击每个视图旁边的复选框以为其指定图层)现在,滚动视图将仅复制其自身图层中的内容(不再包括您的按钮)。此外,现在所有文本视图的合成都将在图形卡中完成。这可以通过不透明的按钮正常工作,但是,如果您将文本放在其自己的图层中的透明背景上(例如,如果您有一个带标题的透明按钮),则会丢失子像素消除锯齿。