Cocoa NSTableView单元格视图中的NSWindow和文本平滑

Cocoa NSTableView单元格视图中的NSWindow和文本平滑,cocoa,nstableview,nswindow,nstableviewcell,Cocoa,Nstableview,Nswindow,Nstableviewcell,我正在编写一个OSX应用程序,在单独的窗口中遇到字体平滑问题 我有一个文本字段,您可以在其中放置文本和建议窗口,该窗口根据您所写的内容弹出建议列表。我使用基于查看单元格的NSTableView来显示这些建议,并使用SFBPopoverWindowController将其显示为“弹出”窗口(尝试了其他具有相同效果的类)。当第一次绘制行时,它们看起来很好,但在我选择它们(键盘或鼠标)后,字体的重量会发生变化。这只是视觉效果,就像你会改变字体的平滑方法,而不是粗体设置 “Music note”是此处

我正在编写一个OSX应用程序,在单独的窗口中遇到字体平滑问题

我有一个文本字段,您可以在其中放置文本和建议窗口,该窗口根据您所写的内容弹出建议列表。我使用基于查看单元格的
NSTableView
来显示这些建议,并使用
SFBPopoverWindowController
将其显示为“弹出”窗口(尝试了其他具有相同效果的类)。当第一次绘制行时,它们看起来很好,但在我选择它们(键盘或鼠标)后,字体的重量会发生变化。这只是视觉效果,就像你会改变字体的平滑方法,而不是粗体设置

“Music note”是此处选定的单元格

更奇怪的是,在我隐藏并显示窗口3次之后,从那时起一切都正常

同样,“Music note”是选定的单元格

选择是通过覆盖
NSTableRowView
类及其
DrawSelectionDirect:
方法完成的,但我尝试在自定义
NSTableCellView
类中绘制所有内容,但没有任何帮助。文本是标准的
NSTextField
-没有任何更改


SFBPopoverWindow(及其控制器)只创建一次,并与styleMask
NSBorderlessWindowMask
一起重用,backing
NSBackingStoreBuffered
,defer设置为
YES
。我在
SFBPopoverWindowController
中所做的唯一更改是关闭“窗口成为关键窗口”,但它不会更改任何内容。

这可能与表视图绘制所选单元格的方式有关(
setSelectionHightLightStyle:
)。在代码或IB/情节提要文件中,尝试将样式设置为None/
NSTableViewSelectionHighlightStyleNone
,然后自己绘制选择(在
NSTableRowView
子类中)

背景:当您使用
NSTableViewSelectionHighlightStyleRegular
NSTableViewSelectionHighlightStyleSourceList
时,表视图假定您使用标准的选择行为和外观,并使用一些魔法来支持这一点

==========

更新

==========

我之前的回答仍然有效,但因为它只描述了问题并暗示了解决方法,所以我想添加一个真正的解决方案。如果要对表视图(使用自定义字体和颜色)使用
NSTableViewSelectionHighlightStyleRegular
,则需要一种方法来“禁用”高亮显示行后出现的系统魔法。一个建议的解决办法是。它有很多缺点,根本不是一个好的解决方案

因此,让我们仔细看看一行高亮显示后立即生效的系统“魔力”:
NSTableRowView
有一个属性interiorBackgroundStyle,根据文档,它是“子视图应如何绘制的指示”。此外,“此值是基于为NSTableRowView设置的属性集动态计算的。当子类基于当前显示的特性以不同方式绘制时,子类可以替代此值。也可以调用此方法来确定子视图应使用的颜色,或者,NSControls可以将其单元格上的-backgroundStyle设置为此值。”

我假设此样式将继承子视图层次结构,并导致文本字段看起来很奇怪。系统假定高亮显示的单元格背景为黑色,并将
interiorBackgroundStyle
更改为黑色。其他控件尝试相应地进行调整

我认为有两种方法可以解决这个问题:

1) 覆盖
NSTableRowView
子类中的
interiorBackgroundStyle
,并返回适合您界面的样式(在我的例子中是
.light
,因为我的高亮显示颜色是非常亮的蓝色)。这对我有用


2) 如果更改整个样式有点太多,因为您只希望某些元素不更改其样式,那么您可能只需要调整这些子类。我还没有尝试过这一点。

我自己在一个自定义视图中看到了这个问题,该视图显示了大量文本。在用高光(不同的背景色)重新绘制文本的某些部分后,文本将显示为“锯齿状”。我没有找到答案,但在我改用CALayers后,它就消失了。我知道这没用,但我觉得10.7版和10.8版都有漏洞。1月,你刚刚救了我的命。当选择“常规”时,我不认为AppKit的工程师们在做神奇的绘图工作。我认为任何“特殊”的东西都只限于“源列表”样式。天哪。非常感谢。我的桌子现在看起来很性感。未来的谷歌人,看看这个答案。它救了一个男人的命。压倒一切的室内背景风格对我来说很有魅力。奇怪的是,在我的应用程序中,这个问题只在非视网膜显示器上表现出来。视网膜显示器上的NSTableView中的文本看起来很好。尽管如此,这一修正还是奏效了。谢谢