0

次のスライダーコントロールが必要です。

  • 全長があります(秒単位の合計期間に対応します)
  • UISliderスライダーで「アクセス可能」な全長内の範囲とは異なり
  • スライダーはその「アクセス可能な」トラック上の位置にあり、それを超えることはありません。

私は現在、次のアプローチを見ていますが、どちらにも長所と短所があるようです。

  1. サブクラスを作成しUISlider、それに新しいプロパティと機能を追加します
  2. UIViewUISliderとaを含むカスタムコントロールを作成しUIProgressBar、の1つと同様のAPIを提供しますUISlider
  3. カスタム描画コードを使用して、コントロールを最初から作成します。

私が見逃したいくつかの側面があるかどうかはわかりません。私は今、どのアプローチが私の問題に最も適しているのか疑問に思っています。

4

2 に答える 2

2

以下は、カスタムスライダーを作成する方法を示すいくつかのリンクです。

  1. https://github.com/barrettj/BJRangeSliderWithProgress
  2. https://github.com/cbpowell/CPSlider
  3. https://github.com/buildmobile/iosrangeslider
  4. https://github.com/taviscaios/TVCalibratedSlider
  5. https://github.com/ole/OBSlider

注:通常、UIカスタムコントロールを作成する場合は、UIControlクラスからクラスを継承するだけで、必要なクラスのすべてのプロパティと他のプロパティも持つことができます...ただし、使用には注意してください...。

于 2012-12-11T16:25:21.573 に答える
0

オプション2と3は一筋縄ではいかないと思います。あなたができることは、スライダーの値が変更されたときに呼び出されるメソッドを持っていることです。これは、ユーザーがトラックで許可されている値を超えた場合に、スライダーの値を中央で最大に設定します。

これに似たものでスライダーインスタンスを宣言します(メインビットはターゲットの追加です)

UISlider *slider = [[UISlider alloc] initWithFrame:CGRectZero];
slider.continuous = TRUE;
slider.minimumValue = MIN_VALUE;   // some min value constant or something?
slider.maximumValue = SLIDER_MAX_VALUE;  // some max value constant for the entire slider
slider.value = MIN_VALUE;   // or anything else you want

[slider addTarget:self action:@selector(checkBeyondTrack:) forControlEvents:UIControlEventValueChanged];
[self.contentView addSubview:slider];

ここで、スライダーを定義した場所と同じクラスのcheckBeyondTrackメソッドが必要です。

- (void)checkBeyondTrack:(id)sender {
    UISlider *slider = sender;        

    // if we've attempted to go beyond the value allowed
    if (slider.value > MAX_TRACK) {
        [slider setValue:MAX_TRACK animated:YES];
    }
}

ユーザーがスライダーの値を変更するたびに、スライダーターゲットメソッドcheckBeyondTrack:が呼び出され、チェックが実行され、必要に応じて値がリセットされます。

于 2012-12-11T12:35:32.370 に答える