处理多个 UISlider
Handle Multiple UISlider
我有 4 个 UISlider,最小值为 0,最大值为 10。我有一个常数值(例如:20)。
我的目标是 4 个滑块值的总和不超过该常量值。
例如:如果我拖动并设置为第一个和第二个滑块的最大值(即 10),那么现在 4 个滑块的总和为 20。
我不想让其他 2 个滑块(第 3、4 个)增加。如果我减少任何滑块(第一个或第二个)值意味着我可以允许它们(2、3、4)增加滑块值。
帮我实现这个。
You can see this screen shot
You can see this screen shot
有一个所有滑块调用 valueChanged
事件的中央方法。
在该方法中,将所有滑块的值相加。随着总和的变化,调整所有滑块的最大值,以便增加任何一个滑块都不会超过您的总和值。 (每个滑块的新最大值将是其当前值与 max_sum_total - current_sum_total.
之间的差值
因此,如果您将所有滑块设置为 5,您的方法会将所有滑块的最大值调整为 5。
如果滑块A在10,滑块B在5,其他都在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
...等等。
在@IBAction sliderValueChanged
中,计算所有滑块的总和。如果总和大于最大值,只需将 "causing" 滑块(例如用户当前正在拖动的滑块)的值重置为允许的最大值。
// ...
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
}
}
您可以使用下面的代码进行粗略的开始。我正在使用单一方法来处理所有 4 个 UISlider。您可以根据需要重构代码
@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)
}
}
}
我有 4 个 UISlider,最小值为 0,最大值为 10。我有一个常数值(例如:20)。
我的目标是 4 个滑块值的总和不超过该常量值。
例如:如果我拖动并设置为第一个和第二个滑块的最大值(即 10),那么现在 4 个滑块的总和为 20。
我不想让其他 2 个滑块(第 3、4 个)增加。如果我减少任何滑块(第一个或第二个)值意味着我可以允许它们(2、3、4)增加滑块值。
帮我实现这个。
You can see this screen shot
You can see this screen shot
有一个所有滑块调用 valueChanged
事件的中央方法。
在该方法中,将所有滑块的值相加。随着总和的变化,调整所有滑块的最大值,以便增加任何一个滑块都不会超过您的总和值。 (每个滑块的新最大值将是其当前值与 max_sum_total - current_sum_total.
之间的差值因此,如果您将所有滑块设置为 5,您的方法会将所有滑块的最大值调整为 5。
如果滑块A在10,滑块B在5,其他都在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
...等等。
在@IBAction sliderValueChanged
中,计算所有滑块的总和。如果总和大于最大值,只需将 "causing" 滑块(例如用户当前正在拖动的滑块)的值重置为允许的最大值。
// ...
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
}
}
您可以使用下面的代码进行粗略的开始。我正在使用单一方法来处理所有 4 个 UISlider。您可以根据需要重构代码
@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)
}
}
}