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



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

我面临一些问题:


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

最佳答案

我在计算旋钮矩形的x位置时发现一个错误:您使用了应该使用宽度的图像高度。
单元格图形被剪切到控件的框架。也许您可以在细胞醒来时扩展控制框架。
您需要使用NSImage方法drawInRect:fromRect:operation:fraction:respectFlipped:hints:,并为respectFlipped:参数传递YES。苹果的控件通常确实使用翻转的坐标。


补充:扩展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];
}

10-04 17:22