cocoa - NSWindow 和 NSTableView 单元格 View 中的文本平滑

标签 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(及其 Controller )创建一次并与 styleMask NSBorderlessWindowMask 重用,支持 NSBackingStoreBuffered,延迟设置为 YES。我对 SFBPopoverWindowController 所做的唯一更改是关闭成为关键窗口的窗口,但它不会改变任何内容。

最佳答案

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

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

==========

更新

==========

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

因此,让我们仔细看看该行突出显示后立即生效的系统“魔法”:NSTableRowView 有一个属性 InteriorBackgroundStyle - 根据文档 - '< em> subview 应该如何绘制的指示'。此外,该值是根据 NSTableRowView 设置的属性集动态计算的。当子类根据当前显示的属性进行不同绘制时,可以覆盖此值。还可以调用此方法来确定 subview 应使用什么颜色,或者,NSControls 可以将其单元格上的 -backgroundStyle 设置为此值。'

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

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

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

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

关于cocoa - NSWindow 和 NSTableView 单元格 View 中的文本平滑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14120791/

相关文章:

cocoa - NSMutableArray initWithContentsOfFile 内存泄漏

iphone - 无法在单元测试中设置 NSMutableDictionary 中的值

xcode - Mavericks 中的 NSWindow 跨越多个屏幕

cocoa - NSOutlineView 的 SelectedRow 总是返回 -1

objective-c - Objective C 中 unicode 字符的数值

cocoa - 如何在 Cocoa 中实现自定义列表?

objective-c - 当用户在 NSAlert 后按 Enter 时未设置 NSIndexSet

cocoa - 如何将 NSTableView 的选择绑定(bind)到 NSArrayController

swift - 应用程序窗口位于所有窗口之上,包括其他应用程序窗口

objective-c - NSWindow 可恢复并不总是有效