Y a-t-il un drapeau qui peut être défini qui entraînera une surlignée d'un bouton de cacao lorsqu'il est sourcillé. J'en ai besoin de ce problème avec l'objectif C sur OSX. p>
3 Réponses :
Configurer une zone de suivi pour la vue avec
Pouvez-vous s'il vous plaît expliquer comment faire cela avec le code (au moins avec un exemple ...)?
Quelque chose ci-dessous peut-être la réponse.
class HoverButton: NSButton{ var backgroundColor: NSColor? var hoveredBackgroundColor: NSColor? var pressedBackgroundColor: NSColor? private var hovered: Bool = false override var wantsUpdateLayer:Bool{ return true } required init?(coder: NSCoder) { super.init(coder: coder) self.commonInit() } override init(frame frameRect: NSRect) { super.init(frame: frameRect) self.commonInit() } func commonInit(){ self.wantsLayer = true self.createTrackingArea() self.hovered = false self.hoveredBackgroundColor = NSColor.selectedTextBackgroundColor() self.pressedBackgroundColor = NSColor.selectedTextBackgroundColor() self.backgroundColor = NSColor.clearColor() } private var trackingArea: NSTrackingArea! func createTrackingArea(){ if(self.trackingArea != nil){ self.removeTrackingArea(self.trackingArea!) } let circleRect = self.bounds let flag = NSTrackingAreaOptions.MouseEnteredAndExited.rawValue + NSTrackingAreaOptions.ActiveInActiveApp.rawValue self.trackingArea = NSTrackingArea(rect: circleRect, options: NSTrackingAreaOptions(rawValue: flag), owner: self, userInfo: nil) self.addTrackingArea(self.trackingArea) } override func mouseEntered(theEvent: NSEvent) { self.hovered = true NSCursor.pointingHandCursor().set() self.needsDisplay = true } override func mouseExited(theEvent: NSEvent) { self.hovered = false NSCursor.arrowCursor().set() self.needsDisplay = true } override func updateLayer() { if(hovered){ if (self.cell!.highlighted){ self.layer?.backgroundColor = pressedBackgroundColor?.CGColor } else{ self.layer?.backgroundColor = hoveredBackgroundColor?.CGColor } } else{ self.layer?.backgroundColor = backgroundColor?.CGColor } }
Il est également possible de remplacer la cellule du bouton pour propager l'événement de sortie / sortie de la souris à la vue. Je n'ai pas testé tous les styles de boutons, j'utilise un style encastré.
La fonction drawbezel code> est appelée sur MouseNerer si
figurantboreronlwhilemouseIseide code> est vrai.
C'est pourquoi je le remplace simplement et gère mon comportement d'affichage personnalisé dans le bouton. P>
class myButtonCell: NSButtonCell {
override func mouseEntered(with event: NSEvent) {
controlView?.mouseEntered(with: event)
// Comment this to remove title highlight (for button style)
super.mouseEntered(with: event)
}
override func mouseExited(with event: NSEvent) {
controlView?.mouseExited(with: event)
// Comment this to remove title un-highlight (for recessed button style)
// Here, we un-hilight the title only if the button is not selected
if state != .on { super.mouseExited(with: event) }
}
// removes the default highlight behavior
override func drawBezel(withFrame frame: NSRect, in controlView: NSView) {}
}
// Set the cell class to MyButtonCell in interface builder
class MyButton: NSButton {
var mouseIn: Bool = false { didSet {
// Up to you here - setNeedsDisplay() or layer update
}}
override func mouseEntered(with event: NSEvent) { mouseIn = true }
override func mouseExited(with event: NSEvent) { mouseIn = false }
}