处理多个 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)
            }
        }
    }