我正在尝试在半透明窗口中创建可编辑的透明NSTextField:
我注意到,只要该字段可编辑,即使实际未选择该元素,也会有一个白色的“选择类似”背景。
其他可观察到的症状:
以下代码用于生成字段:
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];
其他观察(可能是一个单独的问题):
我似乎无法找到任何关于此的文档我不知道你们中是否有人发生过这种情况,并且可能有一个解决方案或指向我可能没有偶然发现的文档的指针。
答案 0 :(得分:2)
这里有两个选项,具体取决于您要查找的行为
选项1 - 无第一响应者
假设您使用的是NSWindow,请在调用makeKeyAndOrderFront后将第一个响应者设置为nil
[self.window makeKeyAndOrderFront:self];
[self.window makeFirstResponder:nil];
似乎makeKeyAndOrderToFront:
在愿意接受第一响应者的窗口中查找第一个NSR应答器。然后在该响应者上调用becomeFirstResponder
;导致选项2
选项2 - 覆盖becomeFirstResponder
子类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
从可用性角度来看,我更喜欢这个选项
选项1 - 添加纯色背景
我不清楚; )为什么会出现这种情况,但如果你添加一个纯色背景颜色,文本将会更新。
选项2 - 覆盖textDidChange
在文字字段中覆盖textDidChange:notification
@implementation BPTextField
- (void)textDidChange:(NSNotification *)notification {
[super textDidChange:notification];
[self setNeedsDisplay:YES];
}
@end
最后的笔记
你会注意到文字看起来很糟糕或很僵硬。将背景颜色添加到文本字段或超视图的图层将解决此问题。
答案 1 :(得分:0)
这是对问题第2部分的回答。
阴影瑕疵来自渲染窗口的阴影,当NSTextField中的文本发生更改时,阴影不会更新。
如果窗口的hasShadow方法返回" NO"文本的阴影也不会为文本创建阴影。