sliderValueDidChange вызывается несколько раз

У меня есть UISlider, и я хотел бы сдвинуть 3 UILabels под ним вместе с ползунком, а также обновить их значения, которые зависят от значения ползунка. При перетаскивании ползунка местоположение мигает туда-сюда между тем, где оно должно быть, и обратно в центральное положение. Вставка точки останова для очень незначительного количества, метод sliderValueDidChange вызывается несколько раз, и sliderValue показывает разные значения. Любые идеи?

- (IBAction)sliderValueDidChange:(UISlider *)sender {
// Update the labels
float sliderValue = sender.value;
percentSplitLabel.text = [NSString stringWithFormat:@"%.0f%@", sliderValue * 100, @"%"];
themSplitValueLabel.text = [NSString stringWithFormat:@"%@%.2f", @"$", totalToBeAddedToTabValue];
meSplitValueLabel.text = [NSString stringWithFormat:@"%@%.2f", @"$", totalBillValue - totalToBeAddedToTabValue];

// Reposition the numbers below
CGRect sliderFrame = splitBillSlider.frame;
percentSplitLabel.center = CGPointMake(sliderFrame.origin.x - sliderFrame.size.width/2.0 + sliderFrame.size.width * sliderValue + 150, percentSplitLabel.center.y);
themSplitValueLabel.center = CGPointMake(percentSplitLabel.center.x + percentSplitLabel.frame.size.width + 10, percentSplitLabel.center.y);
meSplitValueLabel.center = CGPointMake(percentSplitLabel.center.x - percentSplitLabel.frame.size.width, percentSplitLabel.center.y);

person James Paul Mason    schedule 13.07.2013    source источник
comment
Не вопрос Xcode. -------- IIRC есть свойство continuous на UISlider, для которого вы можете установить значение NO.   -  person    schedule 13.07.2013
comment
Но я хочу, чтобы он постоянно обновлялся, чтобы по мере его перемещения значения ниже скользили.   -  person James Paul Mason    schedule 13.07.2013
comment
Используете ли вы Auto Layout в своем представлении?   -  person Hejazi    schedule 14.07.2013


Ответы (1)


Если вы используете Auto Layout в своих представлениях, попробуйте отключить его (Инспектор файлов > Снимите флажок «Включить Autolayout»).

person Hejazi    schedule 13.07.2013
comment
Ничего себе... Я был (хотя и непреднамеренно). Отключение автомакета сразу исправило ситуацию. Спасибо! У вас есть объяснение, почему это была проблема? - person James Paul Mason; 14.07.2013
comment
@JamesPMason, Autolayout - вот почему автомакет является проблемой. Лучше, если бы он не был включен по умолчанию... рекомендуется отключать его во всех новых проектах, если только вы не знаете, что он вам нужен (если вы не уверены, нужен ли он вам, он вам не нужен). - person foundry; 14.07.2013
comment
Когда Auto Layout включен, frames подвидов устанавливаются автоматически в соответствии с ограничениями. Итак, что происходило, так это то, что ваш код и Auto Layout меняли положение меток, которые создавали вспышку, которую вы видели. - person Hejazi; 14.07.2013
comment
Поскольку Apple настаивает на том, чтобы разработчики использовали автоматическую компоновку, вы должны знать о версии решения этой проблемы с автоматической компоновкой: создайте IBOutlets для ваших ограничений (или создайте их в коде), а затем обновите ограничения вместо фреймов. , когда вы перетаскиваете ползунок. - person Zev Eisenberg; 14.07.2013
comment
@ZevEisenberg Хороший вопрос, хотя я думаю, что прямое изменение фрейма более эффективно в этом конкретном случае, чем изменение ограничений для каждого небольшого изменения. - person Hejazi; 14.07.2013
comment
Хиджази, почему ты так думаешь? Изменение ограничения не сложнее и не требует больше ресурсов процессора, чем изменение фрейма, а код немного короче. Использование автоматической компоновки, как сказал @Zev, — это то, как движется Apple, поэтому разработчикам следует научиться справляться с этим, а не отключать его. - person rdelmar; 14.07.2013