2016-06-16 3 views
1

У меня есть следующий подкласс NSTextField (с соответствующим подклассом NSTextFieldCell для интервала [подход найден here]). Я пытаюсь изменить цвет рамки и цвет фона на «фокус», но он не работает.OSX NSTextField с цветом фона слоя не работает

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?

ответ

2

Похож на простую проблему ... но для этого требуется много хакерского кода. У меня есть некоторый рабочий фрагмент для вас.

Убедитесь, что ваши текстовые поля защищены слоем!

Избавьтесь от всех этих элементов в ячейке. Apple, хотят выйти на пенсию их в ближайшее время ... Даже не уверен, что какие-либо действительные случаи работать с клетками:

class TGTextFieldCell: NSTextFieldCell { 

} 

Далее мы получаем фактический:

class TGTextField: NSTextField 

Определение собственности холдинга сосредоточены состояние:

private var isFocused = false 

Override став первым респондентом, как вы делали первоначально:

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 { 

} 

Вот картина того, что я получаю: enter image description here

+0

Благодарим вас за тщательный ответ!Однако я не могу избавиться от ячейки, если только не могу воспроизвести способ заполнения в текстовом поле, как это было в моем подклассе ячеек. Если вы можете указать мне на способ сделать это, я, безусловно, буду разорвать камеру (и принять ваш ответ :)). – jake

+0

Я сказал, чтобы избавиться от ячейки только для этого конкретного фонового бизнеса. Вы можете держать свою камеру в курсе. Я просто вставил весь ваш код, и это сработало. 'class TGTextFieldCell: NSTextFieldCell { override func drawingRectForBounds (theRect: NSRect) -> NSRect { let rectInset = NSMakeRect (theRect.origin.x + 7, theRect.origin.y + 7, theRect.size.width, theRect. size.height) возвращение super.drawingRectForBounds (rectInset) } } 'Попробуйте сами. Возможно, вам придется изменить фактические номера. Прокладка выглядит немного глубже, чем нужно. –

+0

Хорошо! Это отлично поработало, мне просто нужно было переопределить 'startFirstResponder', как и я, и вызвать' super.becomeFirstResponder', чтобы обернуть настройку переменной и вернуть true (возможно, это называется даже тогда, когда оно не становится первым ответчиком)? Есть ли причина, по которой я не должен этого делать, или могу ли я отредактировать ваш ответ, чтобы включить этот бит? – jake

-2

попробуйте поместить ваш код цвета фона в viewWillDraw. Например:

-(void)viewWillDraw { 
    [super setBackgroundColor:[NSColor yellowColor]]; 
} 
+0

Я не могу просто 'setBackgroundColor', потому что на основе ячейки, цвет фона смещена , – jake

+0

Также метод установки цвета фона происходит в 'viewWillDraw', он просто вызывает метод для этого (' setBlurredStyles') – jake

Смежные вопросы