gpt4 book ai didi

cocoa - 更改 NSSlider 栏颜色

转载 作者:IT王子 更新时间:2023-10-29 05:33:13 29 4
gpt4 key购买 nike

我有一个 NSWindow 和一个水平 NSSlider。

当窗口背景颜色改变时,我想改变 slider 右侧部分的颜色。

enter image description here

enter image description here

目前,当窗口背景较暗时,栏的右侧部分不再可见。

注意:窗口背景实际上是我通过覆盖窗口 View 子类中的 drawRect 绘制的渐变。

我想我可以通过子类化 NSSliderCell 并重写一些方法,比如 drawBarInside 来改变 slider 的填充颜色,但我不明白它是如何工作的:我应该做一个小方形图像并在旋钮后的矩形中重复绘制它?或者也许只是画一条彩色线?我以前从未这样做过。

我看过this question这很有趣,但它是关于绘制旋钮的,我现在不需要它。

我也看过this one这看起来很有前途,但是当我尝试模仿这段代码时,我的 slider 就消失了......

this question他们使用 drawWithFrame,它看起来很有趣,但我还是不确定它是如何工作的。

我想用我自己的代码而不是使用库来做到这一点。有人可以给我一个关于如何做到这一点的提示吗? :)

我在 Swift 中执行此操作,但如有必要,我可以阅读/使用 Objective-C。

最佳答案

首先,我创建了一个 slider 图像并将其复制到我的项目中。

然后我在 drawBarInside 方法中使用这张图片在 rect 栏中绘制之前 正常的,所以我们只会看到其余部分(我想保持蓝色部分完好无损)。

这必须在 NSSliderCell 的子类中完成:

class CustomSliderCell: NSSliderCell {

let bar: NSImage

required init(coder aDecoder: NSCoder) {
self.bar = NSImage(named: "bar")!
super.init(coder: aDecoder)
}

override func drawBarInside(aRect: NSRect, flipped: Bool) {
var rect = aRect
rect.size = NSSize(width: rect.width, height: 3)
self.bar.drawInRect(rect)
super.drawBarInside(rect, flipped: flipped)
}

}

专业版:有效。 :)

缺点:它移除了条形的圆角边缘,我还没有找到重新绘制它的方法。

custom nsslider

更新:

我对已接受的答案做了一个 Swift 版本,效果很好:

class CustomSliderCell: NSSliderCell {

required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}

override func drawBarInside(aRect: NSRect, flipped: Bool) {
var rect = aRect
rect.size.height = CGFloat(5)
let barRadius = CGFloat(2.5)
let value = CGFloat((self.doubleValue - self.minValue) / (self.maxValue - self.minValue))
let finalWidth = CGFloat(value * (self.controlView!.frame.size.width - 8))
var leftRect = rect
leftRect.size.width = finalWidth
let bg = NSBezierPath(roundedRect: rect, xRadius: barRadius, yRadius: barRadius)
NSColor.orangeColor().setFill()
bg.fill()
let active = NSBezierPath(roundedRect: leftRect, xRadius: barRadius, yRadius: barRadius)
NSColor.purpleColor().setFill()
active.fill()
}

}

关于cocoa - 更改 NSSlider 栏颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29729743/

29 4 0