cocoa - NSOutlineView 带有透明字段编辑器

标签 cocoa nsoutlineview fieldeditor

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

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

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

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

    return text;
}

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

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

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

谢谢!

最佳答案

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

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

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

@interface ASCOutlineView : NSOutlineView {

}

@end

@implementation ASCOutlineView

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

@end

在 Snow Leopard 中编辑表格单元格时,这似乎足以防止耀眼的白色 block 破坏您的 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

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

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

    if([columnCell respondsToSelector: @selector(setFocusRingType:)] != NO)
        [(NSTextFieldCell *)columnCell setFocusRingType: NSFocusRingTypeNone];
}

关于cocoa - NSOutlineView 带有透明字段编辑器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5449214/

相关文章:

Cocoa:将 subview 添加到来自不同类和 Nib 的 View

objective-c - 创建后更改实例化对象的子类

swift - 圆角 NSTextField 用透明角绘制?

Cocoa 在 TableView 中显示许多项目

swift - 在并排具有两个相同 NSOutlineViews 的 macOS Cocoa 应用程序中,有没有办法在两者之间同步展开/折叠项目?

cocoa - NSTableCellView 内的 NSCollectionView 不会调整大小

objective-c - NSOutlineView + DataSource 正确设置。如何添加ImageAndTextCell?

objective-c - NSTableView 中 NSTextFieldCell 的自定义字段编辑器