繁体   English   中英

更改 NSTextField 的边框颜色

[英]Change border color of NSTextField

我想更改 NSTextField 对象的边框颜色,但我无法实现。

我已经尝试过很多解决方案 EX:成为子类,绘制背景...

有没有人可以解决这个问题或分享任何想法?

请告诉我。 非常感谢。

使用NSBezierPath

- (void)drawRect:(NSRect)dirtyRect
{
    NSPoint origin = { 0.0,0.0 };
    NSRect rect;
    rect.origin = origin;
    rect.size.width  = [self bounds].size.width;
    rect.size.height = [self bounds].size.height;

    NSBezierPath * path;
    path = [NSBezierPath bezierPathWithRect:rect];
    [path setLineWidth:2];
    [[NSColor colorWithCalibratedWhite:1.0 alpha:0.394] set];
    [path fill];
    [[NSColor redColor] set]; 
    [path stroke];

    if (([[self window] firstResponder] == [self currentEditor]) && [NSApp isActive])
    {   
        [NSGraphicsContext saveGraphicsState];
        NSSetFocusRingStyle(NSFocusRingOnly);
        [path fill]; 
        [NSGraphicsContext restoreGraphicsState];
    }
    else
    {
        [[self attributedStringValue] drawInRect:rect];
    }
}

输出:

在此处输入图片说明

在此处输入图片说明

您可以尝试 CALayer 而不需要子类化

self.wantsLayer = true
self.layer?.borderColor = NSColor.red.cgColor
self.layer?.borderWidth = 1

对我来说,Parag 的回答导致了一些奇怪的文本字段绘制,所以我最终得到了这个简单的代码(基于他的回答):

- (void)drawRect:(NSRect)dirtyRect {
    [super drawRect:dirtyRect];

    if (!self.borderColor) {
        return;
    }

    NSPoint origin = { 0.0,0.0 };
    NSRect rect;
    rect.origin = origin;
    rect.size.width  = [self bounds].size.width;
    rect.size.height = [self bounds].size.height;

    NSBezierPath * path;
    path = [NSBezierPath bezierPathWithRect:rect];
    [path setLineWidth:2];
    [self.borderColor set];
    [path stroke];
}

Parag答案的SWift 5版本,但增加了用户定义标题和边框颜色的能力。

fileprivate class URLField: NSTextField {
    var title : String?
    var borderColor: NSColor?

    override func mouseDown(with event: NSEvent) {
        super.mouseDown(with: event)
        if let textEditor = currentEditor() {
            textEditor.selectAll(self)
        }
    }

    convenience init(withValue: String?, modalTitle: String?) {
        self.init()

        if let string = withValue {
            self.stringValue = string
        }
        if let title = modalTitle {
            self.title = title
        }
        self.cell?.controlView?.wantsLayer = true
        self.cell?.controlView?.layer?.borderWidth = 1
        self.lineBreakMode = .byTruncatingHead
        self.usesSingleLineMode = true
    }

    override func draw(_ dirtyRect: NSRect) {
        super.draw(dirtyRect)

        if let color = borderColor {
            ///self.layer?.borderColor = color.cgColor
            let path = NSBezierPath.init(rect: frame)
            path.lineWidth = 1
            color.setStroke()
            path.stroke()

            if self.window?.firstResponder == self.currentEditor() && NSApp.isActive {
                NSGraphicsContext.saveGraphicsState()
                NSFocusRingPlacement.only.set()
                NSGraphicsContext.restoreGraphicsState()
            }
        }
    }

    override func viewDidMoveToWindow() {
        super.viewDidMoveToWindow()

        if let title = self.title {
            self.window?.title = title
        }

        // MARK: this gets us focus even when modal
        self.becomeFirstResponder()
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM