UISlider,设置不同范围的图像

时间:2012-01-17 17:58:17

标签: objective-c ios cocoa-touch uislider

我有一个UISlider,我基本上把它分成5段。

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

我正在尝试将此与另一个我同时缩放的scrollView同步,当我移动滑块时,scrollView缩放,当我捏住scrollView时,滑块会移动。

当我在viewDidLoad中初始化滑块时,我为UIControlStateNormal和UIControlStateSelected创建了不同的thumbImages,如下所示:

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 个答案:

答案 0 :(得分:1)

查看UISlider提供的属性,您可以非常强烈地感觉到,虽然该类旨在让您自定义它的外观,但在用户调整它时动态更改控件的外观可能不是设计者考虑到了。否则,他们会包含您建议的那种机制:将不同图像与值范围相关联的方法。

如果您想简化方法,首先想到的是使用KVO来观察滑块。如果每次更新滑块的值时都可以收到通知,则可以在一个位置更新拇指图像。不幸的是,它看起来像UISlider doesn't fully support KVO

接下来我要考虑的是创建自己的滑块控件。这不是火箭科学 - 你需要的只是绘制控件,将拇指画在上面,并允许拇指在一个维度上滑动。如果你让拇指成为控制其余部分的子视图,那就是小菜一碟。然后,您可以根据需要添加KVO支持,或者一直使用并支持不同范围的不同拇指图像。

如果您不想这样做,您可以将UISlider子类化以添加图像数组,范围数组以及覆盖-setValue:以使用它们。

最后,你现在所拥有的并不是那么糟糕。如果你在动作和-handleZoom方法中重复了这些代码,那就不太好了,但是应该很容易将公共代码分解为一个可以从两个地方调用的适当方法。

答案 1 :(得分:0)

KVO的替代方案是使用通知模式。注册您感兴趣的对象(例如,当值更改时您想要“更新”的任何对象)以接收通知。当滑块更改值时,让它发布带有新值的通知。