2011-08-16 83 views
34

我想在表示时间轴上整数的离散点处停止滑块。什么是最好的方法来做到这一点?我不想在两者之间有任何价值。如果滑块可以“捕捉”到每个离散点的位置,那就太好了。iOS如何让滑块在离散点停止

回答

35

为了使滑块在特定点处“粘住”,viewcontroller应该在链接到滑块的valueChanged方法中根据滑块的值确定合适的四舍五入值,然后使用setValue:animated:将滑块移动到适当的地方。所以,如果滑块从0变为2,并且用户将其更改为0.75,则您认为这应该是1,并将滑块值设置为该值。

+5

弥敦道下面说,使用“润色”内,因为它会在拖动时闪烁,如果你使用的valueChanged – Zenuka

+1

,但只适用如果滑块是连续的,但肯定的,在这种情况下,它是一个更好的解决方案 – jrturton

60

我在这里采取的步骤与jrturton的回答中所述的几乎相同,但是我发现滑块会比较明显地滞后于我的动作。这是我如何做到这一点:

将滑块放入Interface Builder中的视图。 设置滑块的最小/最大值。 (我用0和5)

在.h文件:

@property (strong, nonatomic) IBOutlet UISlider *mySlider; 
- (IBAction)sliderChanged:(id)sender; 

在.m文件:

- (IBAction)sliderChanged:(id)sender 
{ 
    int sliderValue; 
    sliderValue = lroundf(mySlider.value); 
    [mySlider setValue:sliderValue animated:YES]; 
} 

在此之后在Interface Builder我迷上了“触摸的内心'滑块事件的文件的所有者,而不是'价值改变'。现在,当我的手指抬起时,它可以平滑地移动滑块并捕捉到每个整数。

谢谢@ jrturton!

UPDATE - 斯威夫特:

@IBOutlet var mySlider: UISlider! 

@IBAction func sliderMoved(sender: UISlider) { 
    sender.setValue(Float(lroundf(mySlider.value)), animated: true) 
} 

此外,如果有达至情节板中我已上传一个简单的例子对挂钩的东西混淆到github上:https://github.com/nathandries/StickySlider

+2

很好,但它”会下来。 lroundf将舍入到最接近的整数。 –

+1

我也会使用'Touch Up Outside' – Zenuka

5

我做了这是怎么回事首先将当前滑块值的“输出”变量设置为一个整数(默认情况下它是一个浮点数)。然后将输出编号设置为滑块的当前值:

int output = (int)mySlider.value; 
mySlider.value = output; 

这会将其设置为以1整数为增量移动。要使其在特定的数字范围内移动,例如5秒内,请使用以下公式修改您的输出值。在上面的前两行之间加上:

int output = (int)mySlider.value; 
int newValue = 5 * floor((output/5)+0.5); 
mySlider.value = newValue; 

现在当你移动它时,你的滑块“跳”到5的倍数。

4

我一样弥敦道建议,但我也想更新相关UILabel实时显示当前值,所以这里是我做过什么:

- (IBAction) countdownSliderChanged:(id)sender 
{ 
    // Action Hooked to 'Value Changed' (continuous) 

    // Update label (to rounded value) 

    CGFloat value = [_countdownSlider value]; 

    CGFloat roundValue = roundf(value); 

    [_countdownLabel setText:[NSString stringWithFormat:@" %2.0f 秒", roundValue]]; 
} 


- (IBAction) countdownSliderFinishedEditing:(id)sender 
{ 
    // Action Hooked to 'Touch Up Inside' (when user releases knob) 

    // Adjust knob (to rounded value) 

    CGFloat value = [_countdownSlider value]; 

    CGFloat roundValue = roundf(value); 

    if (value != roundValue) { 
     // Almost 100% of the time - Adjust: 

     [_countdownSlider setValue:roundValue]; 
    } 
} 

的缺点,当然,是它每个滑块需要两个动作(方法)。