NSTextField在子类化后淡出

Wou*_*125 7 cocoa subclass nstextfield swift

我使用以下代码将NSTextField子类化:

import Cocoa

class CustomSearchField: NSTextField {
    override func draw(_ dirtyRect: NSRect) {
        self.wantsLayer = true
        let textFieldLayer = CALayer()
        self.layer = textFieldLayer
        self.backgroundColor = NSColor.white
        self.layer?.backgroundColor = CGColor.white
        self.layer?.borderColor = CGColor.white
        self.layer?.borderWidth = 0
        super.cell?.draw(withFrame: dirtyRect, in: self)
    }
}

class CustomSearchFieldCell: NSTextFieldCell {
    override func drawingRect(forBounds rect: NSRect) -> NSRect {
        let minimumHeight = self.cellSize(forBounds: rect).height
        let newRect = NSRect(x: rect.origin.x + 25, y: (rect.origin.y + (rect.height - minimumHeight) / 2) - 4, width: rect.size.width - 50, height: minimumHeight)

        return super.drawingRect(forBounds: newRect)
    }
}
Run Code Online (Sandbox Code Playgroud)

这一切都运行正常,它按我的意愿绘制我的NSTextField.唯一的问题是,只要我将界面的其他部分作为第一个响应者(在NSTextField外部单击),NSTextField(占位符或填充文本)内的文本就会淡出.一旦我再次点击它,它就会逐渐消失.我现在一直在寻找安静,但是无法弄清楚为什么会这样.我只是希望文本始终可见,而不是淡入淡出.

它与我正在添加的CALayer有关,以完成我的造型.

每当我在文本字段中从viewDidLoad运行相同的设置时,它就像一个魅力.例如:

class ViewController: NSViewController {
    @IBOutlet weak var searchField: NSTextField!

    override func viewDidLoad() {
        initCustomSearchField()
    }

    private func initCustomSearchField() {
        searchField.wantsLayer = true
        let textFieldLayer = CALayer()
        searchField.layer = textFieldLayer
        searchField.backgroundColor = NSColor.white
        searchField.layer?.backgroundColor = CGColor.white
        searchField.layer?.borderColor = CGColor.white
        searchField.layer?.borderWidth = 0
        searchField.delegate = self
    }
}
Run Code Online (Sandbox Code Playgroud)

Ala*_*lan 5

draw方法应该用于绘制视图而不是设置属性.并且对于你的问题不要设置为self.layer直接使用sublayer.

我对你的代码的建议:

class CustomTextField :NSTextField {

    override init(frame frameRect: NSRect) {
        super.init(frame: frameRect)

        setupView()
    }

    required init?(coder: NSCoder) {
        super.init(coder: coder)
        setupView()
    }

    func setupView(){
        textColor = .green
    }
}

class CustomTextFieldCell: NSTextFieldCell {

    override init(textCell string: String) {
        super.init(textCell: string)
        setupView()
    }

    required init(coder: NSCoder) {
        super.init(coder: coder)

        setupView()
    }

    func setupView(){
        backgroundColor = .red
    }


    override func drawingRect(forBounds rect: NSRect) -> NSRect {
        let newRect = NSRect(x: (rect.width - rect.width/2)/2, y: 0, width: rect.width/2, height: 20)
        return super.drawingRect(forBounds:newRect)
    }

    override func draw(withFrame cellFrame: NSRect, in controlView: NSView) {
        super.draw(withFrame: cellFrame, in: controlView)
        controlView.layer?.borderColor = NSColor.white.cgColor
        controlView.layer?.borderWidth = 2
    }

}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 你在draw方法中设置了很多文本字段的颜色属性,这在我看来并不是一个好地方.你可以在viewDidLoad中只使用一个引用甚至使用didSet来完成所有这些属性.Draw方法用于创建无法使用自己的属性创建的自定义视图.我不确定我是否理解你对房产的评论的最后部分,你能举个例子吗? (2认同)
  • 好吧,在这种情况下,继承你的`NSTextField`并覆盖`init`方法并在其中设置颜色.当您在绘图中设置它时,每次视图更改时都会调用draw方法并且您反复设置属性,但如果您在初始化程序中设置它,则只设置一次.对于边界部分,我认为你正在寻找`isBordered = false` (2认同)