我正在使用自定义NSSliderCell创建自定义NSSlider。除旋钮外,一切都很漂亮。当我将其拖动到最大值时,旋钮被剪裁,我只能看到旋钮图像的50%。
在分配我的自定义NSSliderCell时,我将knobThickness设置为我用作旋钮的图像的宽度。我假设(我猜错了)它会考虑到这一点并阻止它剪裁吗?
任何想法我做错了什么?只有当旋钮被剪裁为50%时,滑块才会达到maxValue,所以在没有添加任何值的情况下它不会移动。
- (void)drawKnob:(NSRect)knobRect {
NSImage * knob = _knobOff;
knobRectVar = knobRect;
[[self controlView] lockFocus];
[knob
compositeToPoint:
NSMakePoint(knobRect.origin.x+4,knobRect.origin.y+knobRect.size.height+20)
operation:NSCompositeSourceOver];
[[self controlView] unlockFocus];
}
- (void)drawBarInside:(NSRect)rect flipped:(BOOL)flipped {
rect.size.height = 8;
[[self controlView] lockFocus];
NSImage *leftCurve = [NSImage imageNamed:@"customSliderLeft"];
[leftCurve drawInRect:NSMakeRect(5, 25, 8, 8) fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1];
NSRect leftRect = rect;
leftRect.origin.x=13;
leftRect.origin.y=25;
leftRect.size.width = knobRectVar.origin.x + (knobRectVar.size.width/2);
[leftBarImage setSize:leftRect.size];
[leftBarImage drawInRect:leftRect fromRect: NSZeroRect operation: NSCompositeSourceOver fraction:1];
[[self controlView] unlockFocus];
}
答案 0 :(得分:3)
对于每种控件尺寸,NSSLider都需要关闭旋钮图像的特殊尺寸:
NSRegularControlSize: 21x21
NSSmallControlSize: 15x15
NSMiniControlSize: 12x12
不幸的是,旋钮图像的高度不得超过其中一个参数。但它的宽度可能会更长。如果是这样,您可以像这样计算旋钮的x位置:
CGFloat newOriginX = knobRect.origin.x *
(_barRect.size.width - (_knobImage.size.width - knobRect.size.width)) / _barRect.size.width;
其中_barRect是您的酒吧背景的cellFrame:
- (void)drawBarInside:(NSRect)cellFrame flipped:(BOOL)flipped;
我为自定义NSSlider创建了一个简单的解决方案。点击此链接 https://github.com/Doshipak/LADSlider
答案 1 :(得分:1)
除了[NSSliderCell knobRectFlipped:]
之外,您还可以覆盖[NSSliderCell drawKnob:]
。
这是我的解决方案:
- (void)drawKnob:(NSRect)rect
{
NSImage *drawImage = [self knobImage];
NSRect drawRect = [self knobRectFlipped:[self.controlView isFlipped]];
CGFloat fraction = 1.0;
[drawImage drawInRect:drawRect fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:fraction respectFlipped:YES hints:nil];
}
- (NSRect)knobRectFlipped:(BOOL)flipped
{
NSImage *drawImage = [self knobImage];
NSRect drawRect = [super knobRectFlipped:flipped];
drawRect.size = drawImage.size;
NSRect bounds = self.controlView.bounds;
bounds = NSInsetRect(bounds, ceil(drawRect.size.width / 2), 0);
CGFloat val = MIN(self.maxValue, MAX(self.minValue, self.doubleValue));
val = (val - self.minValue) / (self.maxValue - self.minValue);
CGFloat x = val * NSWidth(bounds) + NSMinX(bounds);
drawRect = NSOffsetRect(drawRect, x - NSMidX(drawRect) + 1, 0);
return drawRect;
}
答案 2 :(得分:0)
知道已经有一段时间了,但我自己遇到了这个问题,并找到了一个快速而肮脏的解决方法。
我无法解决这个问题的最初原因,但似乎NSSlider期待一个二次手柄图像。 我发现最简单的方法是将滑块的范围设置为0.0f - 110.0f。
然后,如果值为>,则检查分配的valueChanged目标方法。 100.0f并将其设置回该值,如果是的话。我在右侧创建了一个背景图像,其中包含一些仅限alpha像素的像素,因此您的背景并不比实际的推子范围宽。
快速而又脏,但不需要很多代码,效果很好。 希望这有助于其他人绊倒同样的问题。
答案 3 :(得分:-2)
您无需从单元格绘制方法内部锁定和解锁对ControlView的焦点。这些方法只能由您的controlView的-drawRect:方法调用,该方法在视图的焦点锁定时调用。
为什么要在旋钮图像合成到-drawKnob的Y坐标上添加20个点?