2013-10-31 29 views
1

我正在使用自定义的UISlider。我使用slider.value保存用户输入后的值。过了一段时间,我需要使用[slider setValue:savedValue]将幻灯片的位置恢复到其保存的值。iOS UISlider如何强制执行值和拇指位置之间的同步?

但我注意到在保存时间的位置和恢复后的位置之间存在一些差异。

过了一段时间,我发现如果用户非常快地移动拇指,它会比实际值(某种动量/惯性效果)更进一步。我怎样才能确保一个值对应于一个拇指位置?

谢谢

+0

它可以帮助,如果你可以做一个有示范项目可以证明问题。 Github是做这件事的好地方... – ericg

+0

是的,我不太明白。他们移动滑块,但是你想覆盖用户的移动? – nielsbot

+0

记录的值对应于用户停止触摸屏幕时拇指的位置。然而,拇指继续移动(某些惯性动画),所以当你做一个setValue(getValue)时,它会移回到正确的位置 – webaba

回答

1

假设你正在捕捉UIControlEventTouchUpInside来指示'已完成',请使用改为。

如果不成功,您可以键值观察value,在每次更改时取消将来的保存,并且如果tracking为假,则从现在开始计划新的0.5秒。例如。

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(storeValue) object:nil]; 

if(!slider.tracking) 
{ 
    [self performSelector:@selector(storeValue) withObject:nil afterDelay:0.5]; 
} 

(或者明确地存储保存是否计划如果你发现这一说法,我想,任何性能问题,但除非你有没有过于复杂的话)

+0

谢谢我认为我可以从中获得灵感,它会朝着正确的方向发展 – webaba

2

您是否将该值视为整数? 因为它(UISlider对象)存储一个浮点数,所以将其视为一个整数可能会导致此行为。 也许在处理该更改的操作中重新设置它,我发现此操作需要一次或两次。 EG(此挂在滑块(值改变)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(...)函数来执行此操作...