Я хотел бы сделать слайдер в дискретных точках, представляющих целые числа на временной шкале. Какой лучший способ сделать это? Я не хочу никаких значений между ними. Было бы здорово, если бы ползунок мог "защелкнуться" и на каждую дискретную точку.
IOS, как сделать ползунок в дискретных точках
Ответ 1
Чтобы сделать слайдер "прилипать" в определенных точках, ваш диспетчер просмотра должен в методе valueChanged, связанный с ползунком, определить соответствующий округленный из значения ползунка, а затем использовать setValue: анимированный: переместить ползунок в соответствующий место. Итак, если ваш слайдер идет от 0 до 2, и пользователь меняет его на 0,75, вы предполагаете, что это должно быть 1 и установить для него значение ползунка.
Ответ 2
Шаги, которые я сделал здесь, были почти такими же, как указано в ответе 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 Owner, а не "Value Changed". Теперь это позволяет мне плавно перемещать ползунок и привязки к каждому целому числу, когда мой палец поднимается.
Спасибо @jrturton!
UPDATE - Swift:
@IBOutlet var mySlider: UISlider!
@IBAction func sliderMoved(sender: UISlider) {
sender.setValue(Float(lroundf(mySlider.value)), animated: true)
}
Также, если есть какая-то путаница в подключении к раскадровке, я загрузил быстрый пример в github: https://github.com/nathandries/StickySlider
Ответ 3
Для этого я впервые установил "выходную" переменную текущего значения ползунка в целое число (по умолчанию это поплавок). Затем установите выходной номер как текущее значение ползунка:
int output = (int)mySlider.value;
mySlider.value = output;
Это заставит его перемещаться с шагом в 1 целое число. Чтобы заставить его перемещаться в определенном диапазоне чисел, например, в 5 секунд, измените свое выходное значение на следующую формулу. Добавьте это между двумя первыми двумя строками:
int output = (int)mySlider.value;
int newValue = 5 * floor((output/5)+0.5);
diameterSlider.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];
}
}
Недостатком, конечно, является то, что для слайдера требуется два действия (методы).