如何更改NSScroller颜色?

时间:2014-03-24 22:51:46

标签: objective-c cocoa nsscroller

我试图改变卷轴本身的颜色,似乎我需要覆盖drawKnob周围的东西,但我找不到任何看似合适的方法。

我想到的一种方法是注入一个新的样式并让滚动条使用它但是再一次,我在NSScroller标题中找不到任何关于NSColor的东西。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我认为您必须编写一个子类,并覆盖drawKnob,也许drawKnobSlotInRect:,这取决于您想要更改的内容。

答案 1 :(得分:1)

无需重新绘制。就这么简单:

import AppKit

class CyanideScroller: NSScroller {
    private var _bkgrColour: NSColor = NSColor.black
    private var _knobColour: NSColor = NSColor.white
    private var isHorizontal = false

    var bkgrColour: NSColor {
        get { return _bkgrColour}
        set { _bkgrColour = newValue}
    }

    var knobColour: NSColor {
        get { return _knobColour}
        set { _knobColour = newValue}
    }

    override var frame: CGRect {
        didSet {
            let size = frame.size
            isHorizontal = size.width > size.height
        }
    }

    override func draw(_ dirtyRect: NSRect) {
        _bkgrColour.setFill()
        dirtyRect.fill()
        self.drawKnob()
    }


    override func drawKnob() {
        _knobColour.setFill()

        let dx, dy: CGFloat
        if isHorizontal {
            dx = 0; dy = 3
        } else {
            dx = 3; dy = 0
        }

        let frame = rect(for: .knob).insetBy(dx: dx, dy: dy)
        NSBezierPath.init(roundedRect: frame, xRadius: 3, yRadius: 3).fill()
    }

}