NSTextField - 黑色背景上的白色文本,但黑色光标

moo*_*ots 25 macos customization cocoa objective-c nstextfield

我设置了一个NSTextField文本颜色为白色,背景颜色为(黑色尽管没有渲染背景颜色,所以它是透明的).全部在Interface Builder中.

我遇到的问题是光标是黑色的,几乎看不到.光标不代表文字颜色吗?我有什么想法可以解决这个问题?

否则,NSTextField看起来无法编辑.

uli*_*ess 31

实际上,由-currentEditor为NSTextField返回的NSText*始终是NSTextView*,我将以下代码添加到我的自定义NSTextField子类中:

-(BOOL) becomeFirstResponder
{
    BOOL    success = [super becomeFirstResponder];
    if( success )
    {
        // Strictly spoken, NSText (which currentEditor returns) doesn't
        // implement setInsertionPointColor:, but it's an NSTextView in practice.
        // But let's be paranoid, better show an invisible black-on-black cursor
        // than crash.
        NSTextView* textField = (NSTextView*) [self currentEditor];
        if( [textField respondsToSelector: @selector(setInsertionPointColor:)] )
            [textField setInsertionPointColor: [NSColor whiteColor]];
    }
    return success;
}
Run Code Online (Sandbox Code Playgroud)

因此,如果您已经在替换此类,因为您正在进行自定义背景绘制,那么这可能是一个更加封装的解决方案.也许甚至还有一种方法可以将其转移到NSCell中,因为NSCell是进行绘图并且无论如何都知道颜色的人.

  • 这真的应该被标记为正确答案;在用户开始输入之前,使用其他答案中建议的 `textDidBegin/end:​​` 委托方法不会改变插入符号的颜色。这个立即改变它的焦点。 (2认同)
  • 您可能希望添加相应的` - (BOOL)resignFirstResponder`方法,将颜色更改回黑色,因为所讨论的字段编辑器由窗口中的所有textField共享.将其设置为白色可能不是一个好主意,因为其他字段不会自动将其设置为黑色. (2认同)

Zel*_*lko 28

TextField插入点颜色

NSTextField *textField = self.textField;
NSColor *insertionPointColor = [NSColor blueColor];

NSTextView *fieldEditor = (NSTextView*)[textField.window fieldEditor:YES
                                                           forObject:textField];
fieldEditor.insertionPointColor = insertionPointColor;
Run Code Online (Sandbox Code Playgroud)

  • @Zelko Dvorak太棒了! (2认同)

Rob*_*arl 18

你最好的选择可能是使用NSTextView和- (void)setInsertionPointColor:(NSColor *)color.

  • 不可以.最好的办法是将NSTextField子类化,如下面的uliwitness所述. (4认同)

Jon*_*etz 14

假设您想要设置插入插入符号而不是鼠标光标的颜色,那么使用的建议setInsertionPointColor:应该起作用.

但是,您不一定需要从使用更改NSTextFieldNSTextView.窗口的字段编辑器NSTextField是一个NSTextView.因此,当您NSTextField成为关键视图时,您可以抓住字段编辑器并调用setInsertionPointColor:它.当字段停止为关键视图时,您可能需要重置颜色.

您可以使用NSWindow's fieldEditor:forObject:NSCell's 来获取字段编辑器fieldEditorForView:.

如果您有NSTextField的子类,则可以使用NSTextFieldCell的自定义子类并覆盖它-(NSText*)setUpFieldEditorAttributes:(NSText*)textObj.在该方法中,您可以设置一次插入点颜色,并且在该文本字段的字段编辑器处于活动状态时它将保留.虽然当字段编辑器移动到另一个编辑字段时,插入点颜色将保留,除非您重置它.


Gen*_*ani 5

我打insertionPointColor了电话viewDidLoad,应用程序崩溃了。

我通过调用解决了这个insertionPointColor问题viewDidAppear

对于Swift开发人员:

将插入点颜色方法设置为扩展:

extension NSTextField {
    public func customizeCursorColor(_ cursorColor: NSColor) {
        let fieldEditor = self.window?.fieldEditor(true, for: self) as! NSTextView
        fieldEditor.insertionPointColor = cursorColor
    }
}
Run Code Online (Sandbox Code Playgroud)

并打电话

 override func viewDidAppear() {
        super.viewDidAppear()
        textField.customizeCursorColor(NSColor.red)
    }
Run Code Online (Sandbox Code Playgroud)