iOS学习笔记架构师之路iOS Developer

使用UISlider遇到的问题

2016-03-18  本文已影响2081人  观星
效果图

显示刻度

首先要解决刻度。UISlider提供的方法并不多,和刻度相关的无疑是下面的方法。

- (void)setMinimumTrackImage:(nullable UIImage *)image forState:(UIControlState)state;
- (void)setMaximumTrackImage:(nullable UIImage *)image forState:(UIControlState)state;

图片上自带刻度,且宽度和slider保持一致,设置图片就可以。最初写法是

UIImage *image = [UIImage imageNamed:@"line"] ;

[self.firstSlider setMinimumTrackImage:image forState:UIControlStateNormal];
[self.firstSlider setMaximumTrackImage:image forState:UIControlStateNormal];

结果就不说了。

正确的写法是

UIImage *image = [[UIImage imageNamed:@"line"] resizableImageWithCapInsets:UIEdgeInsetsZero];

[self.firstSlider setMinimumTrackImage:image forState:UIControlStateNormal];
[self.firstSlider setMaximumTrackImage:image forState:UIControlStateNormal];

区别就至于resizableImageWithCapInsets返回一个可改变大小的图片,类似于
android的.9.png。

刻度在图片上,iOS提供了绘制UIImage的方法,因此,我们可以自己绘制。这样,刻度值、背景颜色、slider高度等都可以动态设置。具体的可以参考 <a href="https://github.com/joamafer/JMMarkSlider">JMMarkSlider</a>。

值获取

可以通过UIControlEventValueChanged来得到值更新的通知,通过slider的value属性来获取这个值。

@weakify(self);
[[self.slider rac_signalForControlEvents:UIControlEventValueChanged] subscribeNext:^(UISlider *x) {
    @strongify(self);

    self.lblScore.text = [NSString stringWithFormat:@"%0.f分", x.value];
    
    if (x.value >= 90) {
        self.lblScore.textColor = JXColorTextGreen;
        
    } else {
        self.lblScore.textColor = JXColorRed;
    }
}];

UISlider还有个属性continuous,可以控制UIControlEventValueChanged的触发条件。

@property(nonatomic,getter=isContinuous) BOOL continuous;        
// if set, value change events are generated any time the value changes due to dragging. default = YES

最终停在刻度上

拖到25,放手,又会回到0。问题其实就是怎么知道用户放手了。直接复写touchBegin、touchMove、touchEnd和touchCalcel几个方法。

上一篇 下一篇

猜你喜欢

热点阅读