Пользовательская кнопка NSButton. Как изменить цвет при нажатии

Я хотел бы настроить myButton, чтобы изменить цвет фона, когда происходит mouseDown, и вернуться к цвету по умолчанию, когда вызывается mouseUp.

override func mouseDown(theEvent: NSEvent) {
    super.mouseDown(theEvent)
    self.bgColor = NSColor(hex: 0x4A7AA1)
    self.textColor = NSColor.darkGrayColor()
    self.needsDisplay = true
    self.mouseUp(theEvent)
}

override func mouseUp(theEvent: NSEvent) {
    self.textColor = NSColor.whiteColor()
    self.bgColor = NSColor(hex: 0x6AAFE6, alpha: 0.95)
}

Я пытался запустить этот код, но пока мышь не работает, все представления не перерисовываются. Как я могу использовать эту функцию в классе myButton: NSButton?


person Alessandro    schedule 25.02.2016    source источник


Ответы (2)


Все, что вам нужно сделать, это переопределить drawRect() в конкретном представлении. В drawRect можно проверить, выделена кнопка или нет.

func drawRect(dirtyRect: NSRect) {
    super.drawRect(dirtyRect)
    if self.highlighted {
         // Do custom drawing.
    }
}

Для этого вам не нужно обнаруживать mouseDown и выше. drawRect будет вызываться автоматически

person mangerlahn    schedule 02.05.2016

Я реализовал выделение пользовательского цвета кнопки следующим образом:

    override func draw(_ dirtyRect: NSRect) {
    super.draw(dirtyRect);

    setHighlightedColors();
}

private func setHighlightedColors() {
    let textColorDifference: CGFloat = 50/255;

    let textHighlightedColor = textColor == .clear ? textColor : NSColor(red: textColor.redComponent - textColorDifference,
                                                                      green: textColor.greenComponent - textColorDifference,
                                                                      blue: textColor.blueComponent - textColorDifference,
                                                                      alpha: textColor.alphaComponent);


    let backgroundColorDifference: CGFloat = 20/255;
    let backgroundHighlightedColor = backgroundColor == .clear ? backgroundColor : NSColor(red: backgroundColor.redComponent - backgroundColorDifference,
                                                                                  green: backgroundColor.greenComponent - backgroundColorDifference,
                                                                                  blue: backgroundColor.blueComponent - backgroundColorDifference,
                                                                                  alpha: backgroundColor.alphaComponent);

    let borderColorDifference: CGFloat = 50/255;
    let borderHighlightedColor = borderColor == .clear ? borderColor : NSColor(red: borderColor.redComponent - borderColorDifference,
                                                                          green: borderColor.greenComponent - borderColorDifference,
                                                                          blue: borderColor.blueComponent - borderColorDifference,
                                                                          alpha: borderColor.alphaComponent);
    if isHighlighted {
        applyTextColorAndFont(color: textColor, font: customFont);
        applyBackgroundColor(color: backgroundHighlightedColor);
        applyBorder(color: borderHighlightedColor, width: borderWidth)
    } else {
        applyTextColorAndFont(color: textHighlightedColor, font: customFont);
        applyBackgroundColor(color: backgroundColor);
        applyBorder(color: borderColor, width: borderWidth)
    }
}
person Андрій Погорілко    schedule 24.10.2019