我正在尝试用5个值在Cocoa中实现自定义滑块。请参阅我的演示项目,可以在这里下载:http://s000.tinyupload.com/index.php?file_id=07311576247413689572。
我将NSSliderCell子类化,并实现了drawKnob:(NSRect)knobRect
和drawBarInside:(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];
}