UISlider with increments of 5

How do I have my UISlider go from 1-100 in increments of 5?

48760 次浏览

Add a target like this:

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

And in the valueChanged function set the value to the closest value that is divisible by 5.

[slider setValue:((int)((slider.value + 2.5) / 5) * 5) animated:NO];

So if you need any interval other than 5 simply set it like so:

float interval = 5.0f;//set this
[slider setValue:interval*floorf((slider.value/interval)+0.5f) animated:NO];

There is another way to active the stepper functionality. works in a general case

Example:

range of data is 0 - 2800 and I want the increments to be in 25 unit values. I would do the following

  1. set up the range of the slider to be 0 - (maxRange/unitsteps).
  2. when the value changed method runs use (int)slider.value * unitsteps .

in the example above my slider would be set in IB to range 0 - 112. and my code would be (int)slider.value * 25.

if you then have a text field that can be modified for direct input you would just do the opposite set the slider value to the [textfield.text intValue]/ unitsteps.

For anyone looking for the Swift syntax...

override func viewDidLoad() {
super.viewDidLoad()
mySlider.addTarget(self, action: "sliderValueDidChange:", forControlEvents: .ValueChanged)
}


func sliderValueDidChange(sender:UISlider!)
{
//Set value to the nearest 5...
print((Float)((Int)((sender.value + 2.5) / 5) * 5))
sender.setValue((Float)((Int)((sender.value + 2.5) / 5) * 5), animated: false)
}

Alternatively, just create an Action function with the Assistant Editor (what I did ultimately)...

@IBAction func mySliderValueChanged(sender: UISlider) {
//Set value to the nearest int
sender.setValue(Float(roundf(sender.value)), animated: false)


}

A slightly more elegant solution in Swift could be something like this

let step: Float = 5
@IBAction func sliderValueChanged(sender: UISlider) {
let roundedValue = round(sender.value / step) * step
sender.value = roundedValue
// Do something else with the value


}

This way you get steps of 5. You can read more about the setup in my post.

1. In storyboard mode, drag and drop a stepper and label.  the label will show the stepper values.
  1. left click and drag both label and stepper to your view controller as outlets.

name label as "stepperValue"

  1. drag and drop stepper again making it a func- I called mine "func"

@IBAction func inc(sender: AnyObject) {
stepperValue.text = "(Int(stepper.value) * 5 )"

click the stepper and it will increment by 5

In swift 3, slider with increments +/- 7:

@IBOutlet weak var sldComponent: UISlider!

...

sldComponent.addTarget(self, action:  #selector(_sldComponentChangedValue),for: .valueChanged)

...

func _sldComponentChangedValue(sender: UISlider!) {


self.sldComponent.setValue((round(sender.value / 7) * 7), animated: false)
print("\(sender.value)")


}

Why not just:

@IBAction func onSlider(_ sender: UISlider) {
let value = Int(sender.value)
if value % 5 == 0 {
// handle(value) ...
}
}