如何自定义NSSlider

时间:2013-11-01 16:33:29

标签: objective-c macos cocoa nsslider

我正在尝试使用5个值在Cocoa中实现自定义滑块。请参阅我的演示项目,可在此处下载:http://s000.tinyupload.com/index.php?file_id=07311576247413689572

Custom Slider

我已经将 NSSliderCell 子类化,并实现了drawKnob:(NSRect)knobRectdrawBarInside:(NSRect)cellFrame flipped:(BOOL)flipped等方法。

我正面临一些问题:

  1. 我无法正确定位旋钮的背景图像。我知道我可以改变旋钮的框架,我已经尝试做一些计算来正确定位旋钮,但我无法使其适用于我的自定义滑块。有人可以帮帮我吗?
  2. 我自定义滑块背景的高度为41px。在drawBarInside:(NSRect)cellFrame flipped:(BOOL)flipped我也将帧的高度更改为41px,但整个背景都不可见。为什么?
  3. 我注意到包含的图像(背景和旋钮)垂直翻转。为什么?请注意,与底部相比,背景中的边框顶部较暗,但是当我绘制背景时,这反过来了。

1 个答案:

答案 0 :(得分:2)

  1. 我在计算旋钮矩形的x位置时发现了一个错误:你使用了你应该使用宽度的图像高度。

  2. 正在将单元格绘图剪切到控件的框架。也许你可以在你的手机醒来时扩展控制框架。

  3. 您需要使用NSImage方法drawInRect:fromRect:operation:fraction:respectFlipped:hints:,并为respectFlipped:参数传递YES。 Apple的控件通常使用翻转坐标。

  4. 已添加:在awakeFromNib中展开框架似乎不起作用,框架会被撤回。这是有效的。不要覆盖drawBarInside:flipped:,而是添加此覆盖:

    - (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
    {
        NSRect controlFrame = [controlView frame];
        float bgHeight = self.backgroundImage.size.height;
        if (controlFrame.size.height < bgHeight)
        {
            controlFrame.size.height = bgHeight;
            [controlView setFrame: controlFrame];
        }
    
        [self.backgroundImage
            drawInRect: [controlView bounds]
            fromRect: NSZeroRect
            operation: NSCompositeSourceOver
            fraction: 1.0
            respectFlipped: YES
            hints: NULL];
        [self drawKnob];
    }