3


カスタム UISlider を実装しようとしています。次のコードを持つ UISliderCustom というクラスで拡張しました。

@implementation UISliderCustom

- (id)initWithCoder:(NSCoder *)aDecoder{
    if(self == [super initWithCoder:aDecoder]){
        self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, 200, 13);

        UIImage *slideMin = [[UIImage imageNamed:@"slideMinimum.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 5, 0, 0)];
        UIImage *slideMax = [[UIImage imageNamed:@"slideMaximum.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 5, 0, 0)];

        [self setThumbImage:[UIImage imageNamed:@"slideThumb.png"] forState:UIControlStateNormal];
        [self setThumbImage:[UIImage imageNamed:@"slideThumb.png"] forState:UIControlStateHighlighted];

        [self setMinimumTrackImage:slideMin forState:UIControlStateNormal];
        [self setMaximumTrackImage:slideMax forState:UIControlStateNormal];
    }

    return self;
}    

@end

私は2つの小さな問題に遭遇しました

  1. スライダーを端の 1 つ (進行状況 = 0.0 / 進行状況 = 1.0) にスライドすると、側面に「残り物」がはっきりと見えます。残念ながら、それを処理する方法もわかりません:)

    スライダー画像: ここに画像の説明を入力 ここに画像の説明を入力 ここに画像の説明を入力

    問題:

    不適切なスライダー エッジ

  2. 通常の UISlider (青と銀) が数秒間表示され、カスタム グラフィックスが読み込まれるか、実際にスライダーを動かしたときにのみ表示されます。なぜこれが起こっているのかわかりません.. 編集:これはシミュレータでのみ発生し、現在は正常に動作しています。

よろしくお願いします:)
シャイ。

4

2 に答える 2

2

私自身も非常によく似た問題を抱えていました。Interface Builder で追加したスライダーのサイズ (幅 x 高さ) が、スライダーをカスタマイズするために使用していた画像のサイズと一致しないことが判明しました。それらを一致させると、スライダーの端にある「残り物」がなくなりました。

于 2012-09-11T21:48:02.020 に答える
2

この効果を実現するために UISlider をサブクラス化する必要はありません。サブクラス化したとしても、drawRect メソッドでトラック イメージを設定することはありません。drawRect には描画コードのみを含める必要があります。コントロールの任意の部分を再描画する必要がある場合はいつでも呼び出されます。

サブクラス内 (initWithFrame および initWithCoder から呼び出される) または最初にスライダーを作成するオブジェクト内の別のメソッドで、サムとトラックのイメージを設定します。これは、スライダーが最初に作成されたときに一度だけ行う必要があります。drawRect をオーバーライドしないでください。

そこにも特定のコードがない限り、 awakeFromNib を手動で呼び出す必要はありませんか? IB のスライダーのみを使用したことがある場合は、サブクラスでカスタム イメージを設定する一般的な場所になります。

四角い端の場合、問題は、トラック イメージの極端なエッジが四角であるため、親指の周りに表示されることです。次のように、トラック イメージの両端を丸くし、中央に 1 ピクセルの伸縮可能領域を配置します。

ここに画像の説明を入力

于 2011-12-28T13:00:38.693 に答える