NSSliderCell:绘制自定义旋钮的子类

时间:2013-09-09 13:29:53

标签: objective-c cocoa nscell nsslider

我需要子类NSSliderCell来定制它的外观。 我对酒吧没有任何问题,我覆盖了

- (void)drawBarInside:(NSRect)aRect flipped:(BOOL)flipped

它按预期工作。

- (void)drawKnob:(NSRect)knobRect

同样适用,但我想要一个较小的旋钮,并且调整NSRect的大小不是一个选项,因为我在右侧或左侧有一个不需要的空间(或两者,如果我居中我的自定义旋钮)。

阅读documentation,我应该覆盖

- (void)drawKnob

计算应该绘制旋钮的矩形,然后调用drawKnob: 问题是,试图让cellSize计算我应该在哪里绘制旋钮,我得到一个荒谬的宽度:40000

如何获得合适的宽度? NSSliderCell是NSCell的子类,因此我无法访问帧/边界。

1 个答案:

答案 0 :(得分:3)

我实际设法自定义NSSlider旋钮外观,为NSSliderCell添加width属性并覆盖 - (NSRect)knobRectFlipped:(BOOL)flipped这样:

- (NSRect)knobRectFlipped:(BOOL)flipped {
CGFloat knobCenterPosition = roundf(size.width * self.floatValue / self.maxValue);
// knob should always be entirely visible
knobCenterPosition = MIN(MAX(knobCenterPosition, roundf(KNOB_WIDTH / 2) + KNOB_INSET), size.width - (roundf(KNOB_WIDTH / 2) + KNOB_INSET));
return  NSMakeRect(knobCenterPosition - roundf(KNOB_WIDTH / 2), 0, KNOB_WIDTH, self.cellSize.height);

}

当旋钮与滑块的右边框或左边框重叠时,我需要更改knobCenterPositionKNOB_WIDTHKNOB_INSET是自解释宏)。