处理多个 UISlider

Posted

技术标签:

【中文标题】处理多个 UISlider【英文标题】:Handle Multiple UISlider 【发布时间】:2019-01-17 13:59:50 【问题描述】:

我有 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

【问题讨论】:

我无法理解您在说什么。您使用的语言难以理解和遵循。请尝试澄清..根据我的理解,您希望每个滑块的最大值为 10..但所有 4 个的总和不能超过 20...对吗? 请分享您为此问题编写的任何代码 如果用户从所有四个滑块和 0 开始,然后他们将第 4 个滑块滑到 10,然后将第 2 个滑块滑到 10,那么您是否要防止滑块 1 和 3 被移动?有吗? 【参考方案1】:

@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
    

【讨论】:

【参考方案2】:

有一个所有滑块调用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

...等等。

【讨论】:

【参考方案3】:

您可以使用以下代码粗略开始。我正在使用单一方法来处理所有 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 种情况下都有完全相同的逻辑。为什么? 我知道它可以更简化。如果你有一个封闭的外观,那么你会发现每个案例都有不同的计算。这是为了通过适当的值来消除 Andreas Oetjen 的答案中的滑块闪烁问题给​​发件人

以上是关于处理多个 UISlider的主要内容,如果未能解决你的问题,请参考以下文章

如何使用单个处理程序处理多个 TextInput?

在异常处理结构中可以出现多个catch语句和多个finally语句来处理各种异常吗?

网格搜索预处理多个超参数和多个估计器

iOS:使用多个相同的视图控制器处理多个 uilocalnotification

Logstash:多个配置文件(conf)

java中 在一个异常处理中啥语句块是可多个的