2011-03-27 73 views
4

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

这是我在NSTextFieldCell的子类正在做:

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

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

    return text; 
} 

如果我使用setDrawsBackground:不,这完全无视,我得到一个白色背景。我的解决方案远没有那么好,因为我无法触摸颜色的alpha分量(如果我这么做了,场编辑器会再次使用另一种颜色作为背景),但至少我没有获得白色背景。

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

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

谢谢!

回答

4

问题是,当它发送-editColumn:row:withEvent:select:时,由NSTableView绘制白色背景。它用+ [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 

似乎是在编辑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]; 
} 
0

它看起来像字段编辑器后面有其他背景,它被画成白色。 也许,NSCell或行的背景,无论其他。