2011-01-26 95 views
4

我正在用自定義NSSliderCell創建自定義NSSlider。除了旋鈕之外,所有工作都非常漂亮。當我將其拖動到最大值時,旋鈕被剪切,我只能看到50%的旋鈕圖像。NSSlider NSSliderCell剪裁自定義旋鈕

當分配我的自定義NSSliderCell時,我將knobThickness設置爲我用作旋鈕的圖像的寬度。我認爲(我猜錯了)它會考慮到這一點,並阻止它從剪輯?

任何想法我做錯了什麼?僅當旋鈕被裁剪爲50%時,滑塊纔會擊中maxValue,所以它不會在沒有添加任何值的情況下移動。

- (void)drawKnob:(NSRect)knobRect { 
NSImage * knob = _knobOff; 
knobRectVar = knobRect; 

[[self controlView] lockFocus]; 
[knob 
    compositeToPoint: 
    NSMakePoint(knobRect.origin.x+4,knobRect.origin.y+knobRect.size.height+20) 
    operation:NSCompositeSourceOver]; 
[[self controlView] unlockFocus]; 
} 

- (void)drawBarInside:(NSRect)rect flipped:(BOOL)flipped { 
rect.size.height = 8; 

[[self controlView] lockFocus]; 
NSImage *leftCurve = [NSImage imageNamed:@"customSliderLeft"]; 
[leftCurve drawInRect:NSMakeRect(5, 25, 8, 8) fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1]; 

    NSRect leftRect = rect; 
    leftRect.origin.x=13; 
    leftRect.origin.y=25; 
    leftRect.size.width = knobRectVar.origin.x + (knobRectVar.size.width/2); 
    [leftBarImage setSize:leftRect.size]; 
    [leftBarImage drawInRect:leftRect fromRect: NSZeroRect operation: NSCompositeSourceOver fraction:1]; 
[[self controlView] unlockFocus]; 

} 

回答

-2

您不需要在單元格繪製方法內鎖定和解鎖controlView上的焦點。這些方法僅由您的controlView的-drawRect:方法調用,該方法在鎖定視圖焦點的情況下調用。

爲什麼要在Y座標上添加20個點將旋鈕圖像合成到-drawKnob中?

+0

它吸引50%的旋鈕被削去,並且沒有+20.0 – mootymoots 2011-01-26 19:34:30

0

知道已經有一段時間了,但我自己遇到了這個問題,並發現了一個快速和骯髒的解決方法。

我無法解決這個問題的初始原因,但似乎NSSlider期待的是一個二次手柄圖像。 我找到的最簡單的方法是將滑塊的範圍設置爲0.0f - 110.0f。

然後,如果值大於100.0f,則檢入valueChanged目標方法,如果是,則將其設置回該值。我創建了一個背景圖像,右側有一些僅包含alpha的像素,因此背景不會比實際的推子範圍寬。

快速和骯髒,但不需要很多代碼,工作得很好。 希望這可以幫助其他人絆倒同樣的問題。

2

的NSSLider需要一個特殊的尺寸關閉按鈕圖像的每個控件的大小:

NSRegularControlSize: 21x21 
NSSmallControlSize:  15x15 
NSMiniControlSize:  12x12 

很遺憾,您旋鈕圖像的高度不得超過該參數之一。但它的寬度可能會更長。如果它是你可以指望的旋鈕像這樣的x位置:

CGFloat newOriginX = knobRect.origin.x * 
     (_barRect.size.width - (_knobImage.size.width - knobRect.size.width))/_barRect.size.width; 

哪裏_barRect是從欄背景的cellFrame:

- (void)drawBarInside:(NSRect)cellFrame flipped:(BOOL)flipped; 

我已經創建自定義的簡單解決方案NSSlider。請點擊此鏈接 https://github.com/Doshipak/LADSlider

1

除了[NSSliderCell drawKnob:]之外,您可以覆蓋[NSSliderCell knobRectFlipped:]。 這裏是我的解決方案:

- (void)drawKnob:(NSRect)rect 
{ 
    NSImage *drawImage = [self knobImage]; 

    NSRect drawRect = [self knobRectFlipped:[self.controlView isFlipped]]; 

    CGFloat fraction = 1.0; 

    [drawImage drawInRect:drawRect fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:fraction respectFlipped:YES hints:nil]; 
} 

- (NSRect)knobRectFlipped:(BOOL)flipped 
{ 
    NSImage *drawImage = [self knobImage]; 

    NSRect drawRect = [super knobRectFlipped:flipped]; 

    drawRect.size = drawImage.size; 

    NSRect bounds = self.controlView.bounds; 
    bounds = NSInsetRect(bounds, ceil(drawRect.size.width/2), 0); 
    CGFloat val = MIN(self.maxValue, MAX(self.minValue, self.doubleValue)); 
    val = (val - self.minValue)/(self.maxValue - self.minValue); 
    CGFloat x = val * NSWidth(bounds) + NSMinX(bounds); 

    drawRect = NSOffsetRect(drawRect, x - NSMidX(drawRect) + 1, 0); 
    return drawRect; 
}