Обрабатывать несколько UISlider - PullRequest
0 голосов
/ 17 января 2019

У меня есть 4 UISlider с минимальным значением 0, максимальным значением 10. У меня есть одно постоянное значение (например: 20).

Моя цель - сумма 4 значений слайдера, не превышающих это постоянное значение.

Пример: если я перетаскиваю и устанавливаю максимальное значение 1-го и 2-го ползунка (т.е. 10), то теперь сумма 4 ползунков равна 20.

Я не хочу, чтобы другие 2 ползунка (3-й, 4-й) увеличивались. если я уменьшу значение любого ползунка (1-й или 2-й), то я могу позволить им (2,3,4) увеличить значения ползунка.

помоги мне достичь этого.

Вы можете увидеть этот снимок экрана

Вы можете увидеть этот снимок экрана

Ответы [ 3 ]

0 голосов
/ 17 января 2019

В @IBAction sliderValueChanged вычислите сумму всех ползунков. Если сумма больше максимальной, просто сбросьте значение ползунка «вызывающего» (например, того, которое в данный момент перетаскивается пользователем) до максимально допустимого значения.

// ...
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
    }
}
0 голосов
/ 17 января 2019

Вы можете использовать приведенный ниже код для грубого запуска. Я использую один метод для обработки всех 4 UISliders. Вы можете рефакторинг кода, как вы хотите

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)
            }
        }
    }
0 голосов
/ 17 января 2019

Имейте центральный метод, который все ползунки вызывают для события 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

... и т. Д.

...