我有一个NSWindow和一个水平的NSSlider。
当窗口背景颜色更改时,我想更改滑块右侧的颜色。
当前,当窗口背景为黑暗时,栏的右部不再可见。
注意:窗口背景实际上是我通过覆盖drawRect
窗口视图的子类绘制的渐变。
我以为我可以通过子类化NSSliderCell
和覆盖某种方法来更改滑块的填充颜色,drawBarInside
但我不明白它的工作原理:我应该制作一个正方形的小图像,然后在旋钮后的矩形中反复绘制它吗?还是只是画一条彩色线?我从来没有做过
我已经看了这个问题,这很有趣,但是它与绘制旋钮有关,我现在不需要。
我也看了看一下这个看起来很有前途的代码,但是当我尝试模仿此代码时,我的滑动条就消失了...
在这个问题上,他们使用了drawWithFrame
它,看起来很有趣,但是我不确定它是如何工作的。
我想使用自己的代码而不是使用库来执行此操作。有人可以给我提示如何做吗?:)
我正在Swift中进行此操作,但如有必要,我可以阅读/使用Objective-C。
这是正确的,您必须将其子NSSliderCell
类化才能重绘条或旋钮。
NSRect
只是一个矩形容器,您必须在此容器内绘制。我基于一个程序中的自定义示例NSLevelIndicator
。
首先,您需要计算旋钮的位置。您必须注意控件的最小值和最大值。接下来NSBezierPath
,为背景绘制一个,为左侧绘制另一个。
#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] 删除。
我来说两句