【问题标题】:How to change NSScroller color?如何更改 NSScroller 颜色?
【发布时间】:2014-05-02 13:35:25
【问题描述】:

我正在尝试更改滚动条本身的颜色,似乎我需要覆盖 drawKnob 周围的某些内容,但我找不到任何合适的方法。

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

有什么想法吗?

【问题讨论】:

  • 我想更改旋钮颜色,但保持其他所有内容相同。我看到了这个话题,但它只改变了旋钮槽的颜色,而不是旋钮本身。

标签: objective-c cocoa nsscroller


【解决方案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()
    }

}

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我最终这样做了,但我不得不从头开始重新绘制旋钮,这不是最初的目标。我想知道是否有更好的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    • 2018-08-20
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多