【问题标题】:Handle Multiple UISlider处理多个 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 被移动?有吗?

标签: ios swift uitableview uislider


【解决方案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 的答案中的滑块闪烁问题给​​发件人
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多