iOS如何使滑块停在离散点

时间:2011-08-16 18:46:25

标签: iphone ios slider uislider

我想在表示时间轴上的整数的离散点处制作滑块。最好的方法是什么?我不希望它们之间有任何价值。如果滑块可以“捕捉”到每个离散点的位置,那将会很棒。

5 个答案:

答案 0 :(得分:64)

我在这里采取的步骤与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之后,我将滑块的“Touch Up Inside”事件连接到File的所有者,而不是“Value Changed”。现在它允许我平滑地移动滑块并在我的手指抬起时捕捉到每个整数。

谢谢@jrturton!

更新 - Swift:

@IBOutlet var mySlider: UISlider!

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

如果在故事板中挂起事情有任何困惑,我已经向github上传了一个快速示例:https://github.com/nathandries/StickySlider

答案 1 :(得分:37)

要使滑块“粘贴”在特定点,您的viewcontroller应在从滑块链接到的valueChanged方法中,从滑块的值确定适当的圆角,然后使用setValue:animated:将滑块移动到适当的位置地点。因此,如果滑块从0变为2,并且用户将其更改为0.75,则假设此值应为1并将滑块值设置为该值。

答案 2 :(得分: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的倍数。

答案 3 :(得分:4)

我按照Nathan的建议做了,但我也希望更新实时显示当前值的相关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];
    }
}

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

答案 4 :(得分:0)

具有 ValueChanged TouchUpInside 的快速版本。

编辑:实际上,在这种情况下,您应该挂接3个事件:

# setup some sample data
headers = ['col1', 'col2', 'col3', 'col4', 'col5', 'col6', 'col7', 
           'col8', 'col9', 'col10', 'col11', 'col12', 'col13', 'col14',
           'col15', 'col16', 'col17']
raw_data = 'Mon 11/11,SA,100,31,3-5,60.0,1-3,33.3,1-2,50.0,10,4,0,1,1,2,8'.split(",")
row_dict_data = dict(zip(headers, raw_data))

# append
%%time
df = pd.DataFrame(columns=headers)
for i in range(100):
    df = df.append([row_dict_data])

# CPU times: user 258 ms, sys: 4.82 ms, total: 263 ms
# Wall time: 261 ms


# new dataframe
%%time
df = pd.DataFrame(columns=headers)
df2 = pd.DataFrame([raw_data for i in range(100)], columns=headers)
df3 = pd.concat([df, df2], sort=False)

# CPU times: user 7.03 ms, sys: 1.16 ms, total: 8.2 ms
# Wall time: 7.19 ms

我刚刚粘贴了代码,但是您可以轻松地看到它是如何完成的。

yourSlider.addTarget(self, action: #selector(presetNumberSliderTouchUp), for: [.touchUpInside, .touchUpOutside, .touchCancel])