iOS UISlider數值與滑塊聯動

QiShare發表於2018-08-03

級別:★☆☆☆☆
標籤:「UISlider」「QiSlider」「UISlider自定義」
作者: Xs·H

專案中有個需求是在滑動slider的時候要在滑塊上方實時顯示數值,而且數值要跟著滑塊動。實現效果如下:

演示效果

在寫程式碼之前有兩個思路:

1、在slider的superView上add一個valueLabel,找到slider的滑塊view(thumbView),在slider的valueChanged方法中根據thumbView相對於slider的superView的frame調整valudeLabel的frame和text。使用此思路實現的效果會出現滑動過快時label晃動的現象(有點跟不上滑塊的意思)。

2、找到slider的thumbView,在thumbView上add一個valueLabel,在slider的valueChanged方法中調整valueLabel的text。 使用此思路實現的效果比較符合需求。

按照思路2自定義QiSlider部分程式碼如下:

#import "QiSlider.h"

@interface QiSlider ()

/*! @brief slider的thumbView */
@property (nonatomic, strong) UIView *thumbView;
/*! @brief 顯示value的label */
@property (nonatomic, strong) UILabel *valueLabel;

@end

@implementation QiSlider

- (instancetype)initWithFrame:(CGRect)frame {
    
    if (self = [super initWithFrame:frame]) {
       
        [self addTarget:self action:@selector(sliderValueChanged:) forControlEvents:UIControlEventValueChanged];
    }
    return self;
}


#pragma mark - Setter functions

- (void)setValueText:(NSString *)valueText {
    
    if (![_valueText isEqualToString:valueText]) {
        _valueText = valueText;
        
        self.valueLabel.text = valueText;
        [self.valueLabel sizeToFit];
        self.valueLabel.center = CGPointMake(self.thumbView.bounds.size.width / 2, -self.valueLabel.bounds.size.height / 2);
        
        if (!self.valueLabel.superview) {
            [self.thumbView addSubview:self.valueLabel];
        }
    }
}


#pragma mark - Getter functions

- (UIView *)thumbView {
    
    if (!_thumbView && self.subviews.count > 2) {
        _thumbView = self.subviews[2];
    }
    return _thumbView;
}

- (UILabel *)valueLabel {
    
    if (!_valueLabel) {
        _valueLabel = [[UILabel alloc] initWithFrame:CGRectZero];
        _valueLabel.textColor = _valueTextColor ?: self.thumbTintColor;
        _valueLabel.font = _valueFont ?: [UIFont systemFontOfSize:14.0];
        _valueLabel.textAlignment = NSTextAlignmentCenter;
    }
    return _valueLabel;
}


#pragma mark - Action functions

- (void)sliderValueChanged:(QiSlider *)sender {
    
    if (_valueChanged) {
        _valueChanged(sender);
    } else {
        sender.valueText = [NSString stringWithFormat:@"%.1f", sender.value];
    }
}
@end
複製程式碼

工程程式碼可從QiSlider的Github庫中獲取

關注我們的途徑有:
QiShare(簡書)
QiShare(掘金)
QiShare(知乎)
QiShare(GitHub)
QiShare(CocoaChina)
QiShare(StackOverflow)
QiShare(微信公眾號)


推薦文章:iOS Strong和Copy的區別

相關文章