在运行时更改UISlider的minimum和maximumValues

时间:2011-08-01 21:07:10

标签: iphone objective-c cocoa-touch uislider

如何在更改了最小值和最大值(运行时)后更新UISlider的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更改Sliders的minimum和maximumValues时,slider.value属性不会更改 - 它仍然显示旧值(介于0和1之间)。因此,更改最小和最大属性不会对value属性产生直接影响。


之前:

min = 0 value = 0.5 max = 1

后:

min = 2 value = 0.5 max = 4

这应该是3!


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

newValue=oldvalue/(oldmax-oldmin)*(newmax-newmin)+newmin(做到这一点,希望我没有弄乱它;)

有什么我错过的吗?迫不及待地想看你的建议! :)谢谢。

1 个答案:

答案 0 :(得分:2)

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

是否应该在边缘截断?它应该是新范围内的近似值吗?有许多可能的解决方案,但你想要的特殊情况。 UIKit做出了明智的选择,不做任何选择,而是让你知道该怎么做。

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