处理多个 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的主要内容,如果未能解决你的问题,请参考以下文章
在异常处理结构中可以出现多个catch语句和多个finally语句来处理各种异常吗?