3

我正在尝试在 Cocoa 中实现一个具有 5 个值的自定义滑块。查看我的演示项目,可以在这里下载:http ://s000.tinyupload.com/index.php?file_id=07311576247413689572 。

自定义滑块

我已经将NSSliderCell子类化并实现了诸如此类drawKnob:(NSRect)knobRect的方法drawBarInside:(NSRect)cellFrame flipped:(BOOL)flipped

我面临一些问题:

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

1 回答 1

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

  2. 单元格绘图被剪辑到控件的框架。也许你可以在你的细胞醒来时扩展控制框架。

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

补充:扩展框架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];
}
于 2013-11-03T00:34:57.943 回答