2

NSSlider のノブのサイズが異なるカスタム イメージを描画するためのヒントをインターネットで検索してみました。

今回のアイデアを一か所に集められればと思います。

ほとんどの人が抱える問題は、別のサイズのノブが欲しいということです。私が読むことができる限り、sizetofit をオーバーライドしない限り機能しない大きなノブが必要になることもあります。

私は自分で解決策を持っていないので、同じことを探しました。

私の問題 (および全体の問題) は、ノブの画像が 22x30px であることです。

drawKnob: メソッドが次のサブクラス化された NSSliderCell があります。

- (void)drawKnob:(NSRect)knobRect {

NSImage *image = [NSImage imageNamed:@"sliderImage"];

[[NSColor colorWithPatternImage:image] set];
NSRectFill(knobRect);
}

古いノブを私のイメージで埋めています。次に、RectFill を次のように変更しました。

NSRectFill(NSMakeRect(knobRect.origin.x,knobRect.origin.y,25,35));

より大きな値を取得するためだけに 25/35。

しかし、サイズは幅を変更するつもりはなく(私の場合は垂直スライダーです)、画像は実際のコーナーから始まりません。ノブの真ん中に配置され、左側の一部が切り取られ、右側が二重になっています。

NSSlider を初期化するとき、フレームは画像を収めるのに十分な大きさですが、問題なく表示されません。

-(void)sizeToFit {} を使用した NSSlider のサブクラスを試しましたが、そこに何を設定すればよいかわかりませんでした。

誰もが使用でき、2 ~ 3 時間ググる必要がない、カスタム ノブ イメージを含む NSSlider のサンプル コードをここに 1 つ投稿できればと思います。

誰かがカスタム イメージで Slider を作成したと確信しています

ありがとう

4

1 に答える 1

1

NSSliderCell サブクラスでは、オーバーライドも必要ですknobRectFlipped:。これが私のコードです。ここで、mNormalKnobNSImageメンバー変数 in にロードされますinitWithCoder:

- (NSRect)knobRectFlipped:(BOOL)flipped
{
    NSSlider* theSlider = (NSSlider*) [self controlView];
    NSRect myBounds = [theSlider bounds];
    NSSize knobSize = [mNormalKnob size];
    float travelLength = myBounds.size.width - knobSize.width;
    double valueFrac = ([theSlider doubleValue] - [theSlider minValue]) /
        ([theSlider maxValue] - [theSlider minValue]);
    float knobLeft = roundf( valueFrac * travelLength );
    float knobMinY = roundf( myBounds.origin.y +
        0.5f * (myBounds.size.height - knobSize.height) );
    NSRect knobRect = NSMakeRect( knobLeft, knobMinY,
        knobSize.width, knobSize.height );
    return knobRect;
}

ノブ画像の高さはビューフレームの高さ以下だと思います。

私は試していませんが、ビューフレームの高さに関係なく機能するはずの別のアプローチを次に示します。スライダーとそのスーパービューをコア アニメーション レイヤーを持つものとして指定します。サブクラスのメンバー変数として CALayer を作成し、その内容をノブ イメージに設定します。ノブを描画するときは、ノブレイヤーの位置を調整するだけです。

于 2013-10-19T16:18:16.313 に答える