我有NSTextField
的以下子类(NSTextFieldCell
的相应子类用于间距[找到的方法here])。我正在尝试更改“焦点”上的边框颜色和背景颜色,但它无效。
class TGTextField: NSTextField {
override func viewWillDraw() {
self.layer?.borderWidth = 1
self.layer?.cornerRadius = 2
self.textColor = NSColor(calibratedRed: 55/255, green: 54/255, blue: 54/255, alpha: 1)
self.focusRingType = .None
self.font = NSFont(name: "ProximaNova-Medium", size: 16)!
setBlurredStyles()
}
private func setFocusedStyles() {
self.layer?.borderColor = NSColor(calibratedRed: 92/255, green: 188/255, blue: 214/255, alpha: 1).CGColor
self.layer?.backgroundColor = NSColor(calibratedRed: 247/255, green: 252/255, blue: 252/255, alpha: 1).CGColor
}
private func setBlurredStyles() {
self.layer?.borderColor = NSColor(calibratedRed: 221/255, green: 221/255, blue: 221/255, alpha: 1).CGColor
self.layer?.backgroundColor = NSColor.whiteColor().CGColor
}
override func becomeFirstResponder() -> Bool {
if super.becomeFirstResponder() {
dispatch_async(dispatch_get_main_queue(), {
self.setFocusedStyles()
})
return true
} else {
return false
}
}
override func resignFirstResponder() -> Bool {
if super.resignFirstResponder() {
dispatch_async(dispatch_get_main_queue(), {
self.setBlurredStyles()
})
return true
} else {
return false
}
}
}
class TGTextFieldCell: NSTextFieldCell {
override init(imageCell image: NSImage?) {
super.init(imageCell: image)
}
override init(textCell aString: String) {
super.init(textCell: aString)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func drawingRectForBounds(theRect: NSRect) -> NSRect {
let rectInset = NSMakeRect(theRect.origin.x + 7, theRect.origin.y + 7, theRect.size.width, theRect.size.height)
return super.drawingRectForBounds(rectInset)
}
}
事实上,似乎尝试将self.layer?.backgroundColor
设置为任何地方都不起作用。我不能在文本字段本身设置backgroundColor
,因为基于单元格,背景颜色是偏移的。
如何在backgroundColor
子类的图层上设置NSTextField
?
答案 0 :(得分:2)
看起来像一个简单的问题...但需要大量的hacky代码。我有一些工作片段。
确保文本字段是图层备份的!
摆脱细胞中的所有自定义内容。 Apple希望尽快让他们退休......甚至不确定任何有效的案例是否适用于单元格:
class TGTextFieldCell: NSTextFieldCell {
}
接下来我们来看实际:
class TGTextField: NSTextField
定义一个持有焦点状态的属性:
private var isFocused = false
覆盖成为您最初的第一响应者:
override func becomeFirstResponder() -> Bool {
if super.becomeFirstResponder() {
isFocused = true
return true
} else {
return false
}
}
不幸的是,我们无法轻易捕捉到模糊的瞬间。在互联网上有一些很长的解释...但我们将在事件订阅中捕捉模糊:
func subscribeForEndEdit(){
self.drawsBackground = false
NSNotificationCenter.defaultCenter().addObserver(self, selector:"didEndEdit:", name: NSControlTextDidEndEditingNotification, object: nil)
}
func didEndEdit(notification: NSNotification){
isFocused = false
}
现在在构造函数中调用该订阅覆盖:
override init(frame frameRect: NSRect) {
super.init(frame: frameRect)
subscribeForEndEdit()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
subscribeForEndEdit()
}
现在阻止背景绘制:
self.drawsBackground = false
最后一部分正在改变绘图背景:
override func drawRect(dirtyRect: NSRect) {
//Draw cell content here
super.cell?.drawInteriorWithFrame(dirtyRect, inView: self)
if isFocused {
self.layer?.backgroundColor = NSColor.redColor().CGColor
} else {
self.layer?.backgroundColor = NSColor.whiteColor().CGColor
}
}
整个文件是:
import Cocoa
class TGTextField: NSTextField {
private var isFocused = false
override init(frame frameRect: NSRect) {
super.init(frame: frameRect)
subscribeForEndEdit()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
subscribeForEndEdit()
}
func subscribeForEndEdit(){
self.drawsBackground = false
NSNotificationCenter.defaultCenter().addObserver(self, selector:"didEndEdit:", name: NSControlTextDidEndEditingNotification, object: nil)
}
func didEndEdit(notification: NSNotification){
isFocused = false
}
override func drawRect(dirtyRect: NSRect) {
//Draw cell content here
super.cell?.drawInteriorWithFrame(dirtyRect, inView: self)
if isFocused {
self.layer?.backgroundColor = NSColor.redColor().CGColor
} else {
self.layer?.backgroundColor = NSColor.whiteColor().CGColor
}
}
override func becomeFirstResponder() -> Bool {
if super.becomeFirstResponder() {
isFocused = true
return true
} else {
return false
}
}
deinit {
NSNotificationCenter.defaultCenter().removeObserver(self)
}
}
class TGTextFieldCell: NSTextFieldCell {
}
答案 1 :(得分:-2)
尝试将您设置的背景颜色代码放在viewWillDraw
中。例如:
-(void)viewWillDraw {
[super setBackgroundColor:[NSColor yellowColor]];
}