9
votes

Bouton de cacao qui allumera la souris sur

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.


0 commentaires

3 Réponses :


16
votes

Configurer une zone de suivi pour la vue avec addtrackingarea (à condition que vous utilisiez que leopard ou le nouveau OS X). Vous obtiendrez des événements sur la sortie de la souris et la sortie de la souris.


1 commentaires

Pouvez-vous s'il vous plaît expliquer comment faire cela avec le code (au moins avec un exemple ...)?



1
votes

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
    }
}


0 commentaires

0
votes

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 }
}


0 commentaires