在运行时更改 UISlider 的最小值和最大值

Posted

技术标签:

【中文标题】在运行时更改 UISlider 的最小值和最大值【英文标题】:Changing a UISlider's minimum and maximumValues during runtime 【发布时间】:2011-08-01 21:07:10 【问题描述】:

如何在 UISlider 的 minimum 和 maximumValues 更改后(在运行时)更新其 value 属性?

考虑以下代码:

1 UILabel 连接到一个 IBOutlet - 标签

1 个 UISlider(默认设置 min=0,max=1)连接到 IBOutlet - 滑块和 IBAction - valueChanged

1 按钮连接到 IBAction - buttonTouch

以及以下两个 IBAction 实现:

- (IBAction)valueChanged:(id)sender 
    label.text=[NSString stringWithFormat:@"%f",slider.value];


- (IBAction)buttonTouch:(id)sender 
    slider.maximumValue=4;
    slider.minimumValue=2;
    label.text=[NSString stringWithFormat:@"%f",slider.value];

当我将滑块移动到某个位置时,它会正确更新。

但是,当我通过触发 buttonTouch IBAction 更改滑块的最小值和最大值时,slider.value 属性不会改变 - 它仍然显示旧值(介于 0 和 1 之间)。因此更改最小值和最大值属性不会对 value 属性产生直接影响。


之前:

最小值=0 值=0.5 最大值=1

之后:

min=2 value=0.5 max=4

这应该是 3!


我想您可以根据您对值的了解来计算新值,旧设置的最小值和最大值以及新设置的最小值和最大值,但这似乎不是一个好的解决方案(请参见下面的公式)

newValue = oldvalue / (oldmax - oldmin) * (newmax - newmin) + newmin

【问题讨论】:

【参考方案1】:

您应该手动更新该值。 UIKit 不能也不会猜测当最小和最大限制发生变化时如何处理该值。

是否应该在边缘截断?它应该是新范围内的近似值吗?还有更多可能的解决方案,但您希望使用这种特殊情况下的解决方案。 UIKit 做出了不做选择的明智选择,而是让您自己决定该怎么做。

还有一条黄金法则(除了少数例外),更改一个属性不应影响另一个属性。仅允许操作方法更改多个状态。也许您应该将自己的方法添加为类别:-(void)[UISlider setMinimumValue:(CGFloat)maximumValue:(CGFloat)adjustingValueForNewRange:(BOOL)]

【讨论】:

谢谢。类别非常适合!

以上是关于在运行时更改 UISlider 的最小值和最大值的主要内容,如果未能解决你的问题,请参考以下文章

偏移 UISlider 最小值/最大值图像

如何反转 UISlider 的最小值-最大值?

将手势识别器添加到 UISlider 最小值/最大值图像

UISlider 值更改时单元格未更新值

UISlider 的上次值和当前更改值

当滑块按钮超过最大值的 60% 时,UISlider 最大轨道图像使用最小轨道图像