如何强制 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 值和拇指位置之间的同步?的主要内容,如果未能解决你的问题,请参考以下文章

UISlider 拇指中心位于轨道的起点和终点

如何移除 UISlider 的预填充

自定义 UISlider 拇指图标:如何阻止拇指图标在拖动时恢复为默认圆形图标?

如何读取 UISlider 拇指图像的大小

查找时如何更改 UISlider 拇指的大小

如何以编程方式更改 UISlider 拇指图像的大小