可编辑的透明NSTextField文本显示为白色突出显示

时间:2014-12-26 08:06:11

标签: objective-c cocoa transparent nstextfield

我正在尝试在半透明窗口中创建可编辑的透明NSTextField:

enter image description here

我注意到,只要该字段可编辑,即使实际未选择该元素,也会有一个白色的“选择类似”背景。

其他可观察到的症状:

  • 当字段设置为不可编辑时,此高亮显示不存在。
  • 如果只有多个字段,则第一个字段具有突出显示。
  • 如果未以编程方式设置文本,则不会显示突出显示

以下代码用于生成字段:

f = [[NSTextField alloc] initWithFrame:b2];
f.backgroundColor = [NSColor clearColor];
f.drawsBackground = YES;
f.bordered = NO;
f.bezeled = NO;
f.focusRingType = NSFocusRingTypeNone;
f.textColor = [NSColor whiteColor];
f.editable = YES;
f.selectable = YES;
f.backgroundColor = [NSColor clearColor];
f.allowsEditingTextAttributes = YES;
f.stringValue = @"Foo";

[self.contentView addSubview:f];

其他观察(可能是一个单独的问题):

  • 当字段不是屏幕上的第一个字段并且通过编辑字段以编程方式设置并删除初始文本时,会出现文本的阴影:

enter image description here

我似乎无法找到任何关于此的文档我不知道你们中是否有人发生过这种情况,并且可能有一个解决方案或指向我可能没有偶然发现的文档的指针。

2 个答案:

答案 0 :(得分:2)

第1部分:删除突出显示

这里有两个选项,具体取决于您要查找的行为

选项1 - 无第一响应者

not first responder

  • TextField不是第一响应者
  • 没有突出显示的文字
  • 文字末尾没有光标

假设您使用的是NSWindow,请在调用makeKeyAndOrderFront后将第一个响应者设置为nil

    [self.window makeKeyAndOrderFront:self];
    [self.window makeFirstResponder:nil];

似乎makeKeyAndOrderToFront:在愿意接受第一响应者的窗口中查找第一个NSR应答器。然后在该响应者上调用becomeFirstResponder;导致选项2

选项2 - 覆盖becomeFirstResponder

make first responder

  • TextField是第一响应者
  • 没有突出显示的文字
  • 光标出现在文字的后端

子类NSTextfield并覆盖它的becomeFirstResponder方法

@implementation BPTextField

- (BOOL)becomeFirstResponder {
    BOOL isResponder = [super becomeFirstResponder];

    //Get Field editor, set selected range
    NSText* fieldEditor = [[self window] fieldEditor:YES forObject:self];
    [fieldEditor setSelectedRange:NSMakeRange(fieldEditor.string.length ,0)];

    return isResponder;
}

@end

从可用性角度来看,我更喜欢这个选项

第2部分:删除阴影

选项1 - 添加纯色背景

我不清楚; )为什么会出现这种情况,但如果你添加一个纯色背景颜色,文本将会更新。

选项2 - 覆盖textDidChange

在文字字段中覆盖textDidChange:notification

@implementation BPTextField

- (void)textDidChange:(NSNotification *)notification {
    [super textDidChange:notification];
    [self setNeedsDisplay:YES];
}

@end

最后的笔记

你会注意到文字看起来很糟糕或很僵硬。将背景颜色添加到文本字段或超视图的图层将解决此问题。

答案 1 :(得分:0)

这是对问题第2部分的回答。

阴影瑕疵来自渲染窗口的阴影,当NSTextField中的文本发生更改时,阴影不会更新。

如果窗口的hasShadow方法返回" NO"文本的阴影也不会为文本创建阴影。