2

我正在使用自定义 UISlider。我在用户输入后使用slider.value. 过了一会儿,我需要将幻灯片的位置恢复到它保存的值,使用[slider setValue:savedValue].

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

过了一会儿,我发现如果用户快速移动拇指,它会比实际值走得更远(某种动量/惯性效应)。如何确保一个值对应一个拇指位置?

4

2 回答 2

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(...)如果你也想留在浮动区域,你可以用函数来做......

于 2014-01-22T21:21:10.913 回答
2

假设您要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];
}

(或者如果您发现任何性能问题,或者明确存储是否安排了保存,我猜,但除非您必须这样做,否则不要过于复杂)

于 2014-01-22T21:44:12.667 回答