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