UISlider, настройка изображений для разных диапазонов - PullRequest
1 голос
/ 17 января 2012

У меня есть UISlider, и я в основном делю его на 5 сегментов.

0 <= x < .2
.2 <= x < .4
.4 <= x < .6
.6 <= x < .8
.8 <= x <= 1

Я пытаюсь синхронизировать это с другим scrollView, который у меня увеличивается, поэтому при перемещении ползунка scrollView увеличивается, и когда я зажимаю scrollView, ползунок перемещается.

Когда я инициализирую свой ползунок в viewDidLoad, я создал разные thumbImages для UIControlStateNormal и UIControlStateSelected следующим образом:

if ([self.navigatorSlider value] >= 0 && [self.navigatorSlider value] < .2) {
    [self.navigatorSlider setThumbImage:[UIImage imageNamed:@"firstZoom.png"] forState:UIControlStateNormal];
    [self.navigatorSlider setThumbImage:[UIImage imageNamed:@"firstZoom.png"] forState:UIControlStateSelected];
}

Я делаю это для каждого из 5 различных разделов, которые я отметил выше. Однако в методе IBAction, который у меня есть для слайдера, мне нужно снова установить thumbImages, выполняя те же проверки. Также в моем методе handleZoom мне нужно установить setThumbImage и в этом методе. Я делаю что-то неправильно? Я чувствую, что я должен быть в состоянии установить эти значения где-нибудь, и изображения будут автоматически изменяться при смене слайдера, независимо от того, происходит ли это от обработки самого слайдера или увеличения масштаба scrollView и использования метода setValue для слайдер.

Мысли

Ответы [ 2 ]

1 голос
/ 17 января 2012

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

Первое, что приходит на ум, если вы хотите упростить свой подход, это использовать KVO для наблюдения за слайдером. Если бы вы могли получать уведомления каждый раз, когда значение ползунка обновляется, вы можете обновить изображение большого пальца в одном месте. К сожалению, похоже, что UISlider не полностью поддерживает KVO .

Следующим, что я рассмотрю, будет создание собственного элемента управления ползунком. Это не ракетостроение - все, что вам нужно, это нарисовать элемент управления, провести большим пальцем сверху и позволить большому пальцу скользить в одном измерении. Если вы сделаете большой палец подвидом остальной части элемента управления, это просто кусок пирога. Затем вы можете добавить поддержку KVO, если хотите, или пройти весь путь и поддерживать разные изображения большого пальца для разных диапазонов.

Если вы не хотите этого делать, вы можете создать подкласс UISlider, чтобы добавить свой массив изображений, массив диапазонов и переопределение -setValue:, чтобы использовать их.

Наконец, то, что у вас есть сейчас, не так уж и плохо. Если вы повторили код как в своих действиях, так и в -handleZoom методах, это не так хорошо, но должно быть просто выделить общий код в подходящий метод, который можно вызывать из обоих мест.

0 голосов
/ 17 января 2012

Альтернативой KVO будет использование шаблона уведомления.Зарегистрируйте ваши заинтересованные объекты (например, любой объект, который вы хотите «обновить» при изменении значения), чтобы получать уведомления.Когда ваш слайдер изменит значения, он должен опубликовать уведомление с новым значением.

...