5

カスタム NSSliderCell を使用してカスタム NSSlider を作成しています。ノブ以外は全て綺麗に動いています。ノブがクリッピングされている最大値までドラッグすると、ノブの画像の 50% しか表示されません。

カスタム NSSliderCell を割り当てるとき、ノブとして使用している画像の幅にノブの厚さを設定しています。私はそれを考慮してクリッピングを止めると思いました(間違っていると思います)?

私が間違っていることはありますか?スライダーは、ノブが 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];

}
4

4 に答える 4

0

しばらく経ちましたが、私は自分でこの問題に遭遇し、手っ取り早い回避策を見つけました。

この最初の理由を回避できませんでしたが、NSSlider は 2 次ハンドル イメージを想定しているようです。私が見つけた最も簡単な方法は、たとえば、スライダーの範囲を 0.0f から 110.0f に設定することでした。

次に、値が > 100.0f の場合に割り当てられた valueChanged ターゲット メソッドをチェックインし、そうである場合はその値に戻します。背景が実際のフェーダー範囲よりも広くならないように、右側にアルファのみのピクセルのいくつかのピクセルを含む背景画像を作成しました。

素早く汚れていますが、多くのコードを必要とせず、かなりうまく機能します。これが同じ問題に遭遇した他の人に役立つことを願っています.

于 2012-10-04T20:53:46.090 に答える
-2

セル描画メソッド内から controlView のフォーカスをロックおよびロック解除する必要はありません。これらのメソッドは、controlView の -drawRect: メソッドによってのみ呼び出され、ビューのフォーカスがロックされた状態で呼び出されます。

-drawKnob でノブ イメージが合成される Y 座標に 20 ポイントを追加するのはなぜですか?

于 2011-01-26T18:58:06.093 に答える