我正在使用自定义UISlider。我使用slider.value在用户输入后保存值。过了一会儿,我需要使用[slider setValue:savedValue]将幻灯片的位置恢复为其保存的值。
但我注意到保存时的位置与恢复后的位置之间存在一些差异。
过了一会儿,我发现如果用户非常快速地移动拇指,它会超过实际值(某种动量/惯性效应)。如何确保一个值对应于一个拇指位置?
由于
答案 0 :(得分:2)
您是将该值视为整数吗? 因为它(UISlider对象)存储一个浮点数,将其视为整数会导致此行为。 也许在你处理变更的行动中重新设置它,我发现这需要一两次之前.. 例如(这连接到滑块(值已更改)controlEvent ....
-(IBAction) sliderMoved:(id)sender{
UISlider *sld = (UISlider *)sender;
CGFloat val = sld.value;
val += 0.49; /// rounder...
int result = (int) val;
[sld setValue:(CGFLoat)result animated:YES];
///// etc process entry..
}
这种处理将滑块转换为多位置“开关”,它会捕捉到整数值。如果你想留在浮动区域,你可以用fabsf(...)函数来做...
答案 1 :(得分:2)
假设您正在捕捉UIControlEventTouchUpInside
来指示'已完成',请改用UIControlEventEditingDidEnd
。
如果失败,您可以键值观察value
,在每次更改时取消将来的保存,如果tracking
为假,则从现在起安排新的0.5秒。 E.g。
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(storeValue) object:nil];
if(!slider.tracking)
{
[self performSelector:@selector(storeValue) withObject:nil afterDelay:0.5];
}
(或者如果发现任何性能问题,我会猜测是否安排了保存,但除非必须,否则不要过度复杂化)