我尝试在网上搜索有关NSSlider旋钮的不同大小的自定义图像的好提示。
我希望我们这次可以在一个地方收集这些想法。
大多数人得到的问题是他们想要一个不同大小的旋钮,有时候一个更大的旋钮不起作用,除非你覆盖了我能读到的sizetofit。
我自己没有解决方案并搜索同样的事情。
我的问题(以及整个问题)是,我的旋钮图像是22x30px。
我有一个子类NSSliderCell,其中drawKnob:方法是:
- (void)drawKnob:(NSRect)knobRect {
NSImage *image = [NSImage imageNamed:@"sliderImage"];
[[NSColor colorWithPatternImage:image] set];
NSRectFill(knobRect);
}
用我的图像填充旧旋钮。然后将RectFill更改为:
NSRectFill(NSMakeRect(knobRect.origin.x,knobRect.origin.y,25,35));
25/35只是为了获得更大的价值。
但是尺寸不会改变宽度(在我的情况下是一个垂直滑块)并且图像不是从真正的角落开始。它放在旋钮的中间,左侧的一部分被切掉,在右侧则被标记。
初始化NSSlider时,框架足够大以适应图像,但不会被清晰地显示。
我尝试了NSSlider的一个子类,其中我使用了 - (void)sizeToFit {}但我真的不知道该在那里设置什么。
我希望我们可以在这里发布一个NSSlider的示例代码,其中包含每个人都可以使用的自定义旋钮图像,并且不必谷歌2-3个小时。
我很害羞有人做了一个带有自定义图像的Slider
由于
答案 0 :(得分:1)
在NSSliderCell子类中,您还需要覆盖knobRectFlipped:
。以下是我的一些代码,其中mNormalKnob
是NSImage
加载到initWithCoder:
中的成员变量。
- (NSRect)knobRectFlipped:(BOOL)flipped
{
NSSlider* theSlider = (NSSlider*) [self controlView];
NSRect myBounds = [theSlider bounds];
NSSize knobSize = [mNormalKnob size];
float travelLength = myBounds.size.width - knobSize.width;
double valueFrac = ([theSlider doubleValue] - [theSlider minValue]) /
([theSlider maxValue] - [theSlider minValue]);
float knobLeft = roundf( valueFrac * travelLength );
float knobMinY = roundf( myBounds.origin.y +
0.5f * (myBounds.size.height - knobSize.height) );
NSRect knobRect = NSMakeRect( knobLeft, knobMinY,
knobSize.width, knobSize.height );
return knobRect;
}
我想我假设旋钮图像的高度不超过视图框的高度。
这是另一种应该在不考虑视图框架高度的情况下工作的方法,尽管我还没有尝试过。将滑块及其superview指定为具有Core Animation图层。将CALayer作为子类的成员变量,并将其内容设置为您的旋钮图像。然后在绘制旋钮时,只需调整旋钮层的位置即可。