如何在更改了最小值和最大值(运行时)后更新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
(做到这一点,希望我没有弄乱它;)
有什么我错过的吗?迫不及待地想看你的建议! :)谢谢。
答案 0 :(得分:2)
您应该手动更新值。当最小和最大限制改变时,UIKit不能也不会猜测如何处理该值。
是否应该在边缘截断?它应该是新范围内的近似值吗?有许多可能的解决方案,但你想要的特殊情况。 UIKit做出了明智的选择,不做任何选择,而是让你知道该怎么做。
还有一条黄金法则(少数例外),更改一个属性不应影响另一个属性。只允许操作方法更改多个状态。也许您应该将自己的方法添加为类别:-(void)[UISlider setMinimumValue:(CGFloat)maximumValue:(CGFloat)adjustingValueForNewRange:(BOOL)]
。