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

时间:2013-01-02 10:54:16

标签: cocoa nstableview nswindow nstableviewcell

我正在编写OS X应用程序,并且在单独的窗口中遇到字体平滑问题。

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

Font smoothing problem within cell

“音乐笔记”是此处选定的单元格

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

Font smoothing problem after showing the window 3 times

再次 - “音乐笔记”是选定的单元格。

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

SFBPopoverWindow(及其控制器)创建一次,并与styleMask NSBorderlessWindowMask一起使用,支持NSBackingStoreBuffered,延迟设置为YESSFBPopoverWindowController我做的唯一变化就是关闭窗口成为关键窗口,但它不会改变任何东西。

1 个答案:

答案 0 :(得分:2)

它可能与表视图绘制其选定单元格(setSelectionHightLightStyle:)的方式有关。尝试在代码或IB / Storyboard文件中将样式设置为None / NSTableViewSelectionHighlightStyleNone并自行绘制选择(在NSTableRowView子类中)。

背景:当您使用NSTableViewSelectionHighlightStyleRegularNSTableViewSelectionHighlightStyleSourceList时,表格视图假设您使用标准选择行为和外观,并为支持它做了一些魔术。

==========

<强>更新

==========

我之前的回答仍然有效,但由于它只描述了问题并提示了解决方法,因此我想添加一个真正的解决方案。如果您想在表格视图中使用NSTableViewSelectionHighlightStyleRegular(使用自定义字体和颜色),则需要一种方法来“禁用”突出显示行后出现的系统魔法。一个建议的解决方案是decline the first responder status。它有许多缺点,根本不是一个好的解决方案。

所以,让我们仔细看看一旦突出显示行就会启动的系统'magic':NSTableRowView有一个属性interiorBackgroundStyle,根据文档 - '指示子视图应如何绘制'。此外,'此值是根据为NSTableRowView设置的属性集动态计算的。当子类根据当前显示的属性进行不同的绘制时,子类可以覆盖此值。也可以调用此方法来确定子视图应该使用的颜色,或者NSControls可以在其单元格上将-backgroundStyle设置为此值。'

我认为这种样式将传递给子视图层次结构,并使您的文本字段看起来很奇怪。系统假定突出显示的单元格背景较暗,并将interiorBackgroundStyle更改为暗。其他控件试图相应地适应。

我认为这个问题有两种解决方案:

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

2)如果改变整个样式有点太多,因为你只想让某些元素不改变它们的样式,你可能只需要调整这些子类。我还没试过这个。