5

我正在使用位于 HUD 面板上的 NSOutlineView。我对其进行了配置,使其不绘制背景。一切看起来都很好,直到我双击编辑一个单元格。字段编辑器绘制其背景和焦点环,这完全破坏了整个用户体验。

这就是我在 NSTextFieldCell 的子类中所做的:

- (NSText *)setUpFieldEditorAttributes:(NSText *)textObj
{   
    NSText *text = [super setUpFieldEditorAttributes:textObj];

    [text setDrawsBackground:YES];
    [text setBackgroundColor:[NSColor darkGrayColor]];

    return text;
}

如果我使用 setDrawsBackground:NO 它会被完全忽略,我会得到一个白色的背景。我的解决方案远非好,因为我无法触摸颜色的 alpha 分量(如果我这样做,字段编辑器将再次使用另一种颜色作为背景),但至少我没有得到白色背景。

我想知道这个问题是否有实际的解决方案。我必须提供自己的字段编辑器吗?这值得么?

我想要的只是一个没有背景和焦点环的字段编辑器,只是光标闪烁。

谢谢!

4

2 回答 2

4

问题是NSTableView在发送-editColumn:row:withEvent:select:时绘制了白色背景。它用 +[NSColor textBackgroundColor] 填充单元格的矩形。

如果有一个公共 API 用于覆盖开发人员颜色空间中命名颜色的当前设置,我们可以将其设置在 -editColumn:row:withEvent:select: 等的覆盖内。我不记得这样的 API(指针表示赞赏)。另外:我只在 Snow Leopard 上测试过这段代码(甚至是下面的 Leopard SDK 附录)。针对您打算支持的实际 SDK 和运行时环境验证代码。

NSTableView 有一个用于填充颜色的私有访问器,但它是一个只读属性。没有设置器,所以我们不能只更改标准 NSTableView 上的值。我们必须对它进行子类化。(由于您希望在 outlineView 中具有相同的行为,并且 NSOutlineView 已经是 NSTableView 的子类,我们将继承 NSOutlineView。但是,除了超类之外,代码是相同的。)

@interface ASCOutlineView : NSOutlineView {

}

@end

@implementation ASCOutlineView

- _textBackgroundColor
{
    return  ([NSColor clearColor]);
}

@end

在 Snow Leopard 中编辑表格单元格时,似乎只需要防止那个刺眼的白色块破坏您的 HUD。

不过,针对 Leopard SDK 编译的应用程序需要更多支持。Leopard 的 tableViews 可能已经硬编码了一些渲染属性,所以我们需要重写一个选择方法。

NSTextFieldCells 实际上是 NSTextViews 的包装器,因此它们可以在控件中使用。它们通常共享相同的 textView 实例,该实例由窗口(或其子类,在本例中为面板)管理。NSTableView 更改 NSTextFieldCell 的设置以符合用于编辑数据的系统 UI 设置。大多。然后 NSTextFieldCell 将这些设置传播到 NSTextView。在这条管道上的任何时候,我们都可以重写一两个方法来更改这些属性的值以匹配我们自己的 UI。

我使用 -[NSTextFieldCell setDrawsBackground:] 因为它需要很少的努力才能正确。保持内部状态与我们希望达到的效果一致也很重要,以防其他对象可能依赖于该状态。

@interface ASCTextFieldCell : NSTextFieldCell {

}

@end

@implementation ASCTextFieldCell

- (void)setDrawsBackground: (BOOL)flag
{
    [super setDrawsBackground: NO];
}

@end

在编辑单元格时防止对焦环出现是一个简单的问题,只需更改其对焦环类型的设置即可。令人沮丧的是,IB 不提供对该属性的访问,因此必须以编程方式完成:

for(eachColumn in [hudOutlineView tableColumns])
{
    columnCell = [[ASCTextFieldCell alloc] initTextCell: @""];
    [eachColumn setDataCell: columnCell];

    if([columnCell respondsToSelector: @selector(setFocusRingType:)] != NO)
        [(NSTextFieldCell *)columnCell setFocusRingType: NSFocusRingTypeNone];
}
于 2011-06-10T06:59:51.837 回答
0

看起来字段编辑器后面还有其他背景,它被绘制为白色。可能是 NSCell,或者行的背景,等等。

于 2011-06-09T08:20:03.720 回答