【问题标题】:NSWindow and text smoothing in NSTableView cell viewNSTableView 单元格视图中的 NSWindow 和文本平滑
【发布时间】:2012-12-16 17:54:02
【问题描述】:

我正在编写一个 OS X 应用程序,但在单独的窗口中字体平滑有问题。

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

“音符”是这里选择的单元格

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

再次 - “音符”是选定的单元格。

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

SFBPopoverWindow(和它的控制器)被创建一次,并与 styleMask NSBorderlessWindowMask 一起重复使用,支持 NSBackingStoreBuffered,defer 设置为 YES。我对SFBPopoverWindowController 所做的唯一更改是关闭窗口成为关键窗口,但它并没有改变任何东西。

【问题讨论】:

  • 我自己也看到了这个问题,它有一个自定义视图,它会显示很多文本。用突出显示(不同的背景颜色)重绘文本的某些部分后,文本会出现“锯齿状”。我没有找到答案,但在我转换为使用 CALayers 后它就消失了。我知道这没有帮助,但我觉得这是 10.7 和 10.8 中的一个错误。

标签: cocoa nstableview nswindow nstableviewcell


【解决方案1】:

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

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

===========

更新

===========

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

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

我假设这种样式会被传递到子视图层次结构中,并导致您的文本字段看起来很奇怪。系统假定突出显示的单元格具有深色背景并将interiorBackgroundStyle 更改为深色。其他控件会尝试相应地进行调整。

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

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

2) 如果因为只希望某些元素不改变其样式而改变整个样式有点过多,则可能只需要调整这些子类。我还没试过。

【讨论】:

  • 简,你救了我的理智。 I didn't think the AppKit engineers were doing magical drawing stuff when "Regular" was selected.我认为任何“特殊”的东西都仅限于“源列表”样式。天啊。谢谢你。我的桌子现在看起来很性感。未来的 Google 员工,请阅读此答案。它只是挽救了一个人的生命。
  • 覆盖 internalBackgroundStyle 对我来说就像一个魅力。奇怪的是,在我的应用程序中,问题只在非 Retina 显示器上表现出来。我在 Retina 显示器上的 NSTableView 中的文本看起来不错。无论如何,此修复程序有效。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-15
  • 2017-02-19
  • 2023-04-01
  • 1970-01-01
  • 2018-07-22
相关资源
最近更新 更多