带有透明字段编辑器的 NSOutlineView

Eta*_*ubu 5 cocoa nsoutlineview fieldeditor

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

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

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

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

    return text;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

谢谢!

Hup*_*tes 4

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

如果有一个公共 API 用于覆盖开发者色彩空间中命名颜色的当前设置,我们可以将其设置在 -editColumn:row:withEvent:select: 等的覆盖范围内。我不记得有这样的 API(欢迎指点)。另外:我只在 Snow Leopard 上测试了这段代码(甚至是下面的 Leopard SDK 附录)。根据您想要支持的实际 SDK 和运行时环境验证代码。

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

@interface ASCOutlineView : NSOutlineView {

}

@end

@implementation ASCOutlineView

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

@end
Run Code Online (Sandbox Code Playgroud)

在 Snow Leopard 中编辑表格单元格时,这似乎就是防止那个耀眼的白色块破坏你的 HUD 所需要的一切。

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

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
Run Code Online (Sandbox Code Playgroud)

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

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

    if([columnCell respondsToSelector: @selector(setFocusRingType:)] != NO)
        [(NSTextFieldCell *)columnCell setFocusRingType: NSFocusRingTypeNone];
}
Run Code Online (Sandbox Code Playgroud)