Reputation:
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.
Upvotes: 0
Views: 1386
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
@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
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
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