更改NSSlider栏的颜色

埃里克·艾雅

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

当窗口背景颜色更改时,我想更改滑块右侧的颜色。

在此处输入图片说明

在此处输入图片说明

当前,当窗口背景为黑暗时,栏的右部不再可见。

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

我以为我可以通过子类化NSSliderCell和覆盖某种方法来更改滑块的填充颜色,drawBarInside但我不明白它的工作原理:我应该制作一个正方形的小图像,然后在旋钮后的矩形中反复绘制它吗?还是只是画一条彩色线?我从来没有做过

我已经看了这个问题,这很有趣,但是它与绘制旋钮有关,我现在不需要。

我也看了看一下这个看起来很有前途的代码,但是当我尝试模仿此代码时,我的滑动条就消失了...

这个问题上,他们使用了drawWithFrame它,看起来很有趣,但是我不确定它是如何工作的。

我想使用自己的代码而不是使用库来执行此操作。有人可以给我提示如何做吗?:)

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

阿蒂卡

这是正确的,您必须将其子NSSliderCell类化才能重绘条旋钮

NSRect只是一个矩形容器,您必须在此容器内绘制。我基于一个程序中的自定义示例NSLevelIndicator

首先,您需要计算旋钮的位置。您必须注意控件的最小值和最大值。接下来NSBezierPath,为背景绘制一个,为左侧绘制另一个。

自定义NSSlider控制栏

#import "MyCustomSlider.h"

@implementation MyCustomSlider

- (void)drawBarInside:(NSRect)rect flipped:(BOOL)flipped {

//  [super drawBarInside:rect flipped:flipped];

    rect.size.height = 5.0;

    // Bar radius
    CGFloat barRadius = 2.5;

    // Knob position depending on control min/max value and current control value.
    CGFloat value = ([self doubleValue]  - [self minValue]) / ([self maxValue] - [self minValue]);

    // Final Left Part Width
    CGFloat finalWidth = value * ([[self controlView] frame].size.width - 8);

    // Left Part Rect
    NSRect leftRect = rect;
    leftRect.size.width = finalWidth;

    NSLog(@"- Current Rect:%@ \n- Value:%f \n- Final Width:%f", NSStringFromRect(rect), value, finalWidth);

    // Draw Left Part
    NSBezierPath* bg = [NSBezierPath bezierPathWithRoundedRect: rect xRadius: barRadius yRadius: barRadius];
    [NSColor.orangeColor setFill];
    [bg fill];

    // Draw Right Part
    NSBezierPath* active = [NSBezierPath bezierPathWithRoundedRect: leftRect xRadius: barRadius yRadius: barRadius];
    [NSColor.purpleColor setFill];
    [active fill];


}

@end

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章