iOS как заставить слайдер останавливаться на дискретных точках - PullRequest
41 голосов
/ 16 августа 2011

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

Ответы [ 4 ]

64 голосов
/ 14 марта 2012

Шаги, которые я предпринял здесь, были в значительной степени такими же, как указано в ответе Джертонтона, но я обнаружил, что ползунок будет заметно отставать от моих движений.Вот как я это сделал:

Поместите ползунок в представление в Интерфейсном Разработчике.Установите минимальные / максимальные значения ползунка.(Я использовал 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» для ползунка «Владелец файла», а не «значение изменено».Теперь он позволяет мне плавно перемещать ползунок и привязывать к каждому целому числу, когда мой палец поднят.

Спасибо @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

37 голосов
/ 16 августа 2011

Чтобы ползунок "прилипал" к определенным точкам, ваш viewcontroller должен в методе valueChanged, связанном с ползунком, определить соответствующее округление от значения ползунка и затем использовать setValue: animated: для перемещения ползунка к соответствующему место. Итак, если ваш слайдер переходит с 0 на 2, а пользователь меняет его на 0,75, вы предполагаете, что это должно быть 1, и устанавливаете значение слайдера на это.

5 голосов
/ 12 марта 2013

Что я сделал для этого, так это сначала установил переменную «output» текущего значения ползунка в целое число (по умолчанию это float). Затем установите номер выхода в качестве текущего значения ползунка:

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 голосов
/ 16 мая 2013

Я сделал так, как предложил Натан, но я также хочу обновить связанный 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];
    }
}

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

...