Подтвердить что ты не робот

IOS, как сделать ползунок в дискретных точках

Я хотел бы сделать слайдер в дискретных точках, представляющих целые числа на временной шкале. Какой лучший способ сделать это? Я не хочу никаких значений между ними. Было бы здорово, если бы ползунок мог "защелкнуться" и на каждую дискретную точку.

4b9b3361

Ответ 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];
    }
}

Недостатком, конечно, является то, что для слайдера требуется два действия (методы).