user10928288
user10928288

Reputation:

Handle Multiple UISlider

I have 4 UISlider with minimum value 0, Maximum value 10. I have one constant value(Ex:20).

My goal is sum of 4 slider value doesn't go above that constant value.

Ex: if i drag and set to maximum value of 1st and 2nd slider(i.e 10), Now the sum of 4 slider is 20.

I don't want to allow other 2 sliders(3rd,4th) to increase. if i decrease any slider(1st or 2nd) value means then i can allow them(2,3,4) to increase sliders values.

help me to achieve this.

You can see this screen shot

You can see this screen shot

Upvotes: 0

Views: 1386

Answers (3)

Ajay saini
Ajay saini

Reputation: 2460

You can use the below code for rough start. i am using single method to handle all 4 UISliders. you can refactor code as you want

enter image description here

@IBAction func touchDrag(_ sender: UISlider) {

        switch sender {
        case slider1:
            let f1 = (sender.value + slider2.value)
            let f2 = (slider3.value + slider4.value)
            if  f1 + f2  > 20 {
                sender.value = 20 - (slider2.value + slider3.value + slider4.value)
            }
        case slider2:
            let f1 = (slider1.value + sender.value)
            let f2 = (slider3.value + slider4.value)
            if  f1 + f2  > 20 {
                sender.value = 20 - (slider1.value + slider3.value + slider4.value)
            }
        case slider3:
                let f1 = (slider1.value + slider2.value)
                let f2 = (sender.value + slider4.value)
                if  f1 + f2  > 20 {
                sender.value = 20 - (slider1.value + slider2.value + slider4.value)
            }
        default:
                let f1 = (slider1.value + slider2.value)
                let f2 = (slider3.value + sender.value)
                if  f1 + f2  > 20 {
                sender.value = 20 - (slider1.value + slider2.value + slider3.value)
            }
        }
    }

Upvotes: 0

Andreas Oetjen
Andreas Oetjen

Reputation: 10199

In the @IBAction sliderValueChanged, calculate the sum of all sliders. If the sum is greater the the maximum, just reset the value of the "causing" slider (e.g. the one that is currently being dragged by the user) to the maximum allowed value.

// ...
let maxSum = 20
// ...
@IBAction func sliderValueChanged(_ sender: UISlider) {
    let sum = slider1.value + slider2.value + slider3.value + slider4.value // better: use outlet collection
    if (sum > maxSum) {
        let overflow = sum - maxSum
        sender.value = sender.value - overflow
    }
}

Upvotes: 2

Duncan C
Duncan C

Reputation: 131408

Have a central method that all the sliders call for the valueChanged event.

In that method, sum the values of all the sliders. As the sum changes, adjust the max of all the sliders so that increasing any one slider can't exceed your sum total value. (Each slider's new max would be the the difference between it's current value and max_sum_total - current_sum_total.

So if you set all the sliders to 5, your method would adjust the max for all the sliders to 5.

If Slider A was at 10, Slider B was at 5, and the others were at 0,

Slider A max would be MIN((20 - (A+B+C+D) - A), 10) //5
Slider B max would be MIN((20 - (A+B+C+D) - B), 10) //10

...and so on.

Upvotes: 0

Related Questions