如何强制 UISlider 值和拇指位置之间的同步?
Posted
技术标签:
【中文标题】如何强制 UISlider 值和拇指位置之间的同步?【英文标题】:How to enforce synchronization between UISlider value and thumb position? 【发布时间】:2013-10-31 11:06:35 【问题描述】:我正在使用自定义 UISlider。我使用slider.value
保存用户输入后的值。过了一会儿,我需要使用[slider setValue:savedValue]
将幻灯片的位置恢复到其保存的值。
但我注意到保存时的位置和恢复后的位置之间存在一些差异。
一段时间后,我发现如果用户快速移动拇指,它会比实际值走得更远(某种动量/惯性效应)。如何确保一个值对应一个拇指位置?
【问题讨论】:
如果您可以提供一个示例项目来演示该问题,这可能会有所帮助。 Github 是这样做的好地方... 是的,我不太明白。他们移动滑块,但你想覆盖用户的移动? 记录的值对应用户停止触摸屏幕时拇指的位置。但是,拇指会继续移动(一些惯性动画),所以当你执行 setValue (getValue) 时,它会移回正确的位置 【参考方案1】:假设您使用 UIControlEventTouchUpInside
指示“完成”,请改用 UIControlEventEditingDidEnd
。
如果做不到这一点,您可以键值对观察value
,在每次更改时取消未来的保存,如果tracking
为假,则从现在开始安排新的 0.5 秒。例如
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(storeValue) object:nil];
if(!slider.tracking)
[self performSelector:@selector(storeValue) withObject:nil afterDelay:0.5];
(或者如果你发现任何性能问题,或者明确存储是否安排了保存,我猜,但除非你必须这样做,否则不要过于复杂)
【讨论】:
谢谢,我想我可以从中获得灵感,它正朝着正确的方向发展【参考方案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(...)
函数来做......
【讨论】:
以上是关于如何强制 UISlider 值和拇指位置之间的同步?的主要内容,如果未能解决你的问题,请参考以下文章