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

Выполнение шагов/привязка UISlider

Я пытаюсь реализовать некоторую форму привязки или шагов с помощью UISlider. Я написал следующий код, но он работает не так гладко, как я надеялся. Он работает, но когда я выдвигаю его вверх, он фиксирует 5 точек справа, оставляя палец не центрированным по "скользящему кругу"

Это мой код, где self.lastQuestionSliderValue - это свойство класса, которое я установил на начальное значение ползунка.

    if (self.questionSlider.value > self.lastQuestionSliderValue) {
        self.questionSlider.value += 5.0;
    } else {
        self.questionSlider.value -= 5.0;
    }

    self.lastQuestionSliderValue = (int)self.questionSlider.value;
4b9b3361

Ответ 1

Это на самом деле значительно проще, чем я думал. Первоначально я пытался получить свойство большого пальца и сделать сложную математику. Вот чем я закончил:

h файл:

@property (nonatomic, retain) IBOutlet UISlider* questionSlider;
@property (nonatomic) float lastQuestionStep;
@property (nonatomic) float stepValue;

м файл:

- (void)viewDidLoad {
    [super viewDidLoad];

    // Set the step to whatever you want. Make sure the step value makes sense
    //   when compared to the min/max values for the slider. You could take this
    //   example a step further and instead use a variable for the number of
    //   steps you wanted.
    self.stepValue = 25.0f;

    // Set the initial value to prevent any weird inconsistencies.
    self.lastQuestionStep = (self.questionSlider.value) / self.stepValue;
}

// This is the "valueChanged" method for the UISlider. Hook this up in
//   Interface Builder.
-(IBAction)valueChanged:(id)sender {
    // This determines which "step" the slider should be on. Here we're taking 
    //   the current position of the slider and dividing by the 'self.stepValue'
    //   to determine approximately which step we are on. Then we round to get to
    //   find which step we are closest to.
    float newStep = roundf((questionSlider.value) / self.stepValue);

    // Convert "steps" back to the context of the sliders values.
    self.questionSlider.value = newStep * self.stepValue;
}

Убедитесь, что вы подключили метод и выход для вашего представления UISlider, и вы должны быть в порядке.

Ответ 2

Самое простое решение для меня было просто

- (IBAction)sliderValueChanged:(id)sender {
    UISlider *slider = sender;
    slider.value = roundf(slider.value);
}

Ответ 3

Может, кому-то понадобится! В моей ситуации мне нужен какой-то целочисленный шаг, поэтому я использовал следующий код:

-(void)valueChanged:(id)sender {
    UISlider *slider = sender;
    slider.value = (int)slider.value;
}

Ответ 4

SWIFT VERSION

Пример: Вы хотите, чтобы ползунок шел от 1-10000 с шагом 100. Настройка UISlider выглядит следующим образом:

slider.maximumValue = 100
slider.minimumValue = 0
slider.continuous = true

В действии func() для использования ползунка:

var sliderValue:Int = Int(sender.value) * 100

Ответ 5

Другой подход Swift - сделать что-то вроде

let step: Float = 10
@IBAction func sliderValueChanged(sender: UISlider) {
  let roundedValue = round(sender.value / step) * step
  sender.value = roundedValue
  // Do something else with the value

}

Ответ 6

Действительно простой:

- (void)sliderUpdated:(UISlider*)sli {
    CGFloat steps = 5;
    sli.value = roundf(sli.value/sli.maximumValue*steps)*sli.maximumValue/steps;    
}

Отлично, если вы хотите быстрое решение, и вы добавили цель с помощью UIControlEventValueChanged.