UISlider捕捉固定数量的步骤(如iOS 7设置应用中的文本大小)

我正在尝试创build一个UISlider ,可以让您从一组数字中进行select。 每个滑块的位置应该是等距的,滑块应该alignment每个位置,而不是在它们之间平滑地滑动。 (这是在iOS 7中引入的Settings >“ General >“ Text Size Settings中的滑块的行为。)

iOS 7的文字大小滑块

我想要select的数字是: -3, 0, 2, 4, 7, 10, and 12.

(我对Objective-C非常陌生,所以完整的代码示例比代码片段更有帮助=)

一些其他答案的工作,但这将给你在你的滑块的每个位置之间相同的固定空间。 在这个例子中,您将滑块位置作为索引处理为包含您感兴趣的实际数值的数组。

 @interface MyViewController : UIViewController { UISlider *slider; NSArray *numbers; } @end @implementation MyViewController - (void)viewDidLoad { [super viewDidLoad]; slider = [[UISlider alloc] initWithFrame:self.view.bounds]; [self.view addSubview:slider]; // These number values represent each slider position numbers = @[@(-3), @(0), @(2), @(4), @(7), @(10), @(12)]; // slider values go from 0 to the number of values in your numbers array NSInteger numberOfSteps = ((float)[numbers count] - 1); slider.maximumValue = numberOfSteps; slider.minimumValue = 0; // As the slider moves it will continously call the -valueChanged: slider.continuous = YES; // NO makes it call only once you let go [slider addTarget:self action:@selector(valueChanged:) forControlEvents:UIControlEventValueChanged]; } - (void)valueChanged:(UISlider *)sender { // round the slider position to the nearest index of the numbers array NSUInteger index = (NSUInteger)(slider.value + 0.5); [slider setValue:index animated:NO]; NSNumber *number = numbers[index]; // <-- This numeric value you want NSLog(@"sliderIndex: %i", (int)index); NSLog(@"number: %@", number); } 

我希望有所帮助,祝你好运。

答案与UISlider的答案基本相同,增量为5

要修改它以适合您的情况,您需要创build一个舍入函数,该函数仅返回所需的值。 例如,你可以做一些简单的事情(虽然哈克),像这样:

 -(int)roundSliderValue:(float)x { if (x < -1.5) { return -3; } else if (x < 1.0) { return 0; } else if (x < 3.0) { return 2; } else if (x < 5.5) { return 4; } else if (x < 8.5) { return 7; } else if (x < 11.0) { return 10; } else { return 12; } } 

现在使用上一篇文章的答案来整理值。

 slider.continuous = YES; [slider addTarget:self action:@selector(valueChanged:) forControlEvents:UIControlEventValueChanged]; 

最后,实施更改:

 -(void)valueChanged:(id)slider { [slider setValue:[self roundSliderValue:slider.value] animated:NO]; } 

如果你在步骤之间有固定的空间,你可以像下面这样使用它:

 @IBAction func timeSliderChanged(sender: UISlider) { let newValue = Int(sender.value/15) * 15 sender.setValue(Float(newValue), animated: false) } 

与PengOne类似的方法,但我做了手动四舍五入来更清楚地发生了什么事情。

 - (IBAction)sliderDidEndEditing:(UISlider *)slider { // default value slider will start at float newValue = 0.0; if (slider.value < -1.5) { newValue = -3; } else if (slider.value < 1) { newValue = 0; } else if (slider.value < 3) { newValue = 2; } else if (slider.value < 5.5) { newValue = 4; } else if (slider.value < 8.5) { newValue = 7; } else if (slider.value < 11) { newValue = 10; } else { newValue = 12; } slider.value = newValue; } - (IBAction)sliderValueChanged:(id)sender { UISlider *slider = sender; float newValue = 0.0; if (slider.value < -1.5) { newValue = -3; } else if (slider.value < 1) { newValue = 0; } else if (slider.value < 3) { newValue = 2; } else if (slider.value < 5.5) { newValue = 4; } else if (slider.value < 8.5) { newValue = 7; } else if (slider.value < 11) { newValue = 10; } else { newValue = 12; } // and if you have a label displaying the slider value, set it [yourLabel].text = [NSString stringWithFormat:@"%d", (int)newValue]; }