cocoa – 带透明字段编辑器的NSOutlineView

前端之家收集整理的这篇文章主要介绍了cocoa – 带透明字段编辑器的NSOutlineView前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用位于HUD面板上的NSOutlineView.我配置它,以便它不绘制其背景.在我双击编辑单元格之前,一切看起来都很好.
字段编辑器绘制其背景和焦点环,这完全破坏了整个用户体验.

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

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

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

    return text;
}

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

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

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

谢谢!

解决方法

问题是当发送-editColumn:row:withEvent:select:时,NSTableView会绘制白色背景.它用[NSColor textBackgroundColor]填充单元格的rect.

如果有一个公共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];
}

猜你在找的cocoa相关文章