Изменение минимального и максимального значения UISlider во время выполнения - PullRequest
0 голосов
/ 02 августа 2011

Как мне обновить свойство value UISlider после того, как его минимальное и максимальное значения были изменены (во время выполнения)?

Рассмотрим следующий код:

1 UILabel подключен к IBOutlet - этикетке

1 UISlider (настройки по умолчанию min = 0, max = 1) подключен к ползунку IBOutlet и IBAction - valueChanged

1 кнопка подключена к IBAction - buttonTouch

и следующие две реализации IBAction:

- (IBAction)valueChanged:(id)sender {
    label.text=[NSString stringWithFormat:@"%f",slider.value];
}

- (IBAction)buttonTouch:(id)sender {
    slider.maximumValue=4;
    slider.minimumValue=2;
    label.text=[NSString stringWithFormat:@"%f",slider.value];
}

Когда я перемещаю ползунок в определенное положение, он корректно обновляется.

Однако, когда я изменяю минимальные и максимальные значения ползунков, вызывая IBT-действие buttonTouch, свойство slider.value не изменяется - оно по-прежнему показывает старое значение (от 0 до 1). Таким образом, изменение минимальных и максимальных свойств не оказывает прямого влияния на свойство value.


До:

мин = 0 значение = 0,5 макс = 1

После того, как:

мин = 2 значение = 0,5 макс = 4

Это должно быть 3!


Полагаю, вы могли бы рассчитать новое значение на основе ваших знаний о значении, min и max для старой настройки и min и max для новой настройки, но это не кажется хорошим решением (см. Формулу ниже )

newValue=oldvalue/(oldmax-oldmin)*(newmax-newmin)+newmin (сделал это из головы, надеюсь, я не испортил это;))

Есть что-то, что я пропустил? Не могу дождаться, чтобы прочитать ваши предложения! :) Спасибо.

1 Ответ

2 голосов
/ 02 августа 2011

Вы должны обновить значение вручную. UIKit не может и не делает никаких предположений относительно того, что делать со значением при изменении пределов min и max.

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

Существует также золотое правило (с несколькими исключениями), что изменение одного свойства не должно влиять на другое свойство. Только методы действия могут изменять более одного состояния. Возможно, вам следует добавить свой собственный метод в качестве категории: -(void)[UISlider setMinimumValue:(CGFloat)maximumValue:(CGFloat)adjustingValueForNewRange:(BOOL)].

...