2

我尝试在互联网上搜索为 NSSlider 的旋钮绘制不同尺寸的自定义图像的好技巧。

我希望这次我们可以将想法集中在一个地方。

大多数人遇到的问题是他们想要一个不同尺寸的旋钮,有时一个更大的旋钮不起作用,除非你覆盖我所读到的 sizetofit 。

我自己没有解决方案并搜索了相同的东西。

我的问题(也是整个问题)是,我的旋钮图像是 22x30 像素。

我有一个子类 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

谢谢

4

1 回答 1

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;
}

我想我假设旋钮图像的高度不超过视图框架的高度。

这是另一种方法,它应该在不考虑视图框架高度的情况下工作,尽管我没有尝试过。将滑块及其父视图指定为具有核心动画层。将 CALayer 作为子类的成员变量,并将其内容设置为旋钮图像。然后在绘制旋钮的时候,只需调整旋钮层的位置即可。

于 2013-10-19T16:18:16.313 回答