0

我需要以下滑块控件。

  • 有一个总长度(对应于以秒为单位的总持续时间)
  • UISlider滑块“可访问”的总长度内的范围不同
  • 滑块在该“可访问”轨道上有一个位置,并且不会超出它。

我目前看到以下方法,它们似乎各有利弊:

  1. 创建一个UISlider子类并向其添加新的属性和功能
  2. 我创建了一个UIView包含 UISlider 和 a 的自定义控件,UIProgressBar并提供了一个类似于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 回答