我已经使用以下代码对NSTextField进行了子类化:
这一切都很好地运作了,它正如我所期望的绘制了我的NSTextField。唯一的问题是,一旦我将界面的其他部分设置为第一个响应者(单击NSTextField之外的区域),NSTextField内部的文本(占位符或填充文本)就会变淡。一旦我再次点击它,它就会恢复。我已经搜索了相当长时间了,但无法弄清楚这是为什么。我只希望文本始终可见,而不是闪烁不定。
这与我添加的CALayer样式有关。
每当我从viewDidLoad中运行相同的设置到文本框上时,它都能完美地工作。例如:
我已经使用以下代码对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)
}
}
这一切都很好地运作了,它正如我所期望的绘制了我的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
}
}
super.cell?.draw
,而是调用super.draw
。 - Willeke