4

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

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

单元格内的字体平滑问题

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

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

显示窗口 3 次后字体平滑问题

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

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

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

4

1 回答 1

3

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

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

==========

更新

==========

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

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

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

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

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

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

于 2015-05-08T05:03:57.397 回答