美文网首页iOS开发
iOS UISlider自定义渐变色滑杆

iOS UISlider自定义渐变色滑杆

作者: 弹吉他的少年 | 来源:发表于2020-11-20 10:45 被阅读0次

前言

  • 本文主要介绍继承实现自定义渐变色滑杆,空心滑杆
GitHub地址:KJCategories

简单介绍 Property & API

@interface KJColorSlider : UISlider
/// 颜色数组,默认白色
@property(nonatomic,strong) NSArray<UIColor*>*colors;
/// 每个颜色对应的位置信息
@property(nonatomic,strong) NSArray<NSNumber*>*locations;
/// 颜色的高度,默认2.5px
@property(nonatomic,assign) CGFloat colorHeight;
/// 边框宽度,默认0px
@property(nonatomic,assign) CGFloat borderWidth;
/// 边框颜色,默认黑色
@property(nonatomic,strong) UIColor *borderColor;
/// 回调处理时间,默认为0
@property(nonatomic,assign) float timeSpan;
/// 当前进度,用于外界kvo
@property(nonatomic,assign,readonly) CGFloat progress;
/// 移动回调处理
@property(nonatomic,readwrite,copy) void(^kValueChangeBlock)(CGFloat progress);
/// 移动结束回调处理
@property(nonatomic,readwrite,copy) void(^kMoveEndBlock)(CGFloat progress);
/// 重新设置UI
- (void)kj_setUI;

@end
1. colors和locations配合使用实现渐变色
/// 彩虹渐变色滑杆
slider2.colors = @[UIColorFromHEXA(0xFF0000,1),
                   UIColorFromHEXA(0xFF7F00,1),
                   UIColorFromHEXA(0xFFFF00,1),
                   UIColorFromHEXA(0x00FF00,1),
                   UIColorFromHEXA(0x00FFFF,1),
                   UIColorFromHEXA(0x0000FF,1),
                   UIColorFromHEXA(0x8B00FF,1)];
slider2.locations = @[@0.,@0.16,@(0.16*2),@(0.16*3),@(0.16*4),@(0.16*5),@1.];
/// 饱和度滑杆
slider.colors = @[UIColorFromHEXA(0xF44336,1), UIColorFromHEXA(0xFFFFFF,1)];
slider.locations = @[@0.,@0.8];
2. colorHeight滑杆的高度,内部那条线而非整体的高度
3. borderWidth和borderColor边框相关
4. timeSpan回调间隔时间限制

这里主要用于很多时候在不停滑动的过程当中,会频繁触发内部的方法。所以写这个参数来控制kValueChangeBlock回调的触发频率

5. progress当前进度,相当于self.value

这个参数主要用于外界kvo

/// kvo
[slider kj_observeKey:@"progress" ObserveResultBlock:^(id  _Nonnull newValue, id  _Nonnull oldValue) {
    NSLog(@"%@",newValue);
}];
6. kValueChangeBlock和kMoveEndBlock

kValueChangeBlock:滑动过程当中调用
kMoveEndBlock:滑动结束或者异常中断调用

slider.kValueChangeBlock = ^(CGFloat progress) {
    NSLog(@"progress:%f",progress);
};
slider.kMoveEndBlock = ^(CGFloat progress) {
    NSLog(@"end:%f",progress);
};
7. kj_setUI重设UI调用
附上完整实现
#import "KJColorSlider.h"
#import "UIColor+KJExtension.h"
@interface KJColorSlider()
@property(nonatomic,strong) UIImageView *backImageView;
@property(nonatomic,assign) NSTimeInterval lastTime;
@property(nonatomic,assign) CGFloat progress;
@end

@implementation KJColorSlider
#pragma mark - public method
- (void)kj_setUI{ [self drawNewImage];}

#pragma mark - system method
- (void)awakeFromNib{
    [super awakeFromNib];
    [self setup];
}
- (instancetype)initWithFrame:(CGRect)frame{
    if (self == [super initWithFrame:frame]) {
        [self setup];
    }
    return self;
}
- (void)layoutSubviews{
    [super layoutSubviews];
    if (CGRectEqualToRect(self.backImageView.frame, CGRectZero)) {
        CGRect imgViewFrame = self.backImageView.frame;
        imgViewFrame.size.width = self.frame.size.width;
        imgViewFrame.size.height = self.colorHeight;
        imgViewFrame.origin.y = (self.frame.size.height - self.colorHeight) * 0.5;
        self.backImageView.frame = imgViewFrame;
        [self drawNewImage];
    }
}
#pragma mark - private method
- (void)drawNewImage{
    self.backImageView.image = [UIColor kj_colorImageWithColors:_colors locations:_locations size:CGSizeMake(self.frame.size.width, _colorHeight) borderWidth:_borderWidth borderColor:_borderColor];
    self.progress = self.value;
}
- (void)setup{
    self.colors = @[UIColor.whiteColor];
    self.locations = @[@(1.)];
    self.colorHeight = 2.5;
    self.borderWidth = 0.0;
    self.borderColor = UIColor.blackColor;
    self.backImageView = [[UIImageView alloc] initWithFrame:CGRectZero];
    [self addSubview:self.backImageView];
    [self sendSubviewToBack:self.backImageView];
    self.tintColor = [UIColor clearColor];
    self.maximumTrackTintColor = self.minimumTrackTintColor = [UIColor clearColor];
    [self addTarget:self action:@selector(valueChange) forControlEvents:UIControlEventValueChanged];
    [self addTarget:self action:@selector(endMove) forControlEvents:UIControlEventTouchUpInside];
    [self addTarget:self action:@selector(endMove) forControlEvents:UIControlEventTouchUpOutside];
    [self addTarget:self action:@selector(touchCancel) forControlEvents:UIControlEventTouchCancel];
}
- (void)valueChange{
    self.progress = self.value;
    if (self.kValueChangeBlock) {
        if (_timeSpan == 0) {
            self.kValueChangeBlock(self.value);
        }else if (CFAbsoluteTimeGetCurrent() - self.lastTime > _timeSpan) {
            _lastTime = CFAbsoluteTimeGetCurrent();
            self.kValueChangeBlock(self.value);
        }
    }
}
- (void)endMove{
    self.progress = self.value;
    if (self.kMoveEndBlock) {
        self.kMoveEndBlock(self.value);
        return;
    }
    if (self.kValueChangeBlock) self.kValueChangeBlock(self.value);
}
- (void)touchCancel{
    self.progress = self.value;
    if (self.kMoveEndBlock) self.kMoveEndBlock(self.value);
}

@end
示例代码
__block KJColorSlider *slider = [[KJColorSlider alloc]initWithFrame:CGRectMake(20, 100, kScreenW-40, 30)];
slider.value = 0.5;
[self.view addSubview:slider];
slider.colors = @[UIColorFromHEXA(0xF44336,1), UIColorFromHEXA(0xFFFFFF,1)];
slider.locations = @[@0.,@0.8];
slider.kValueChangeBlock = ^(CGFloat progress) {
    NSLog(@"progress:%f",progress);
};
slider.kMoveEndBlock = ^(CGFloat progress) {
    NSLog(@"end:%f",progress);
};

KJColorSlider *slider2 = [[KJColorSlider alloc] initWithFrame:CGRectMake(20, slider.bottom+30, kScreenW-40, 30)];
slider2.value = 0.5;
slider2.colors = @[UIColorFromHEXA(0xFF0000,1),
                   UIColorFromHEXA(0xFF7F00,1),
                   UIColorFromHEXA(0xFFFF00,1),
                   UIColorFromHEXA(0x00FF00,1),
                   UIColorFromHEXA(0x00FFFF,1),
                   UIColorFromHEXA(0x0000FF,1),
                   UIColorFromHEXA(0x8B00FF,1)];
slider2.locations = @[@0.,@0.16,@(0.16*2),@(0.16*3),@(0.16*4),@(0.16*5),@1.];
[self.view addSubview:slider2];

KJColorSlider *slider3 = [[KJColorSlider alloc] initWithFrame:CGRectMake(20, slider2.bottom+30, kScreenW-40, 30)];
slider3.colorHeight = 28;
slider3.borderColor = UIColor.redColor;
slider3.borderWidth = 1.5;
slider3.value = 0.5;
[self.view addSubview:slider3];

/// kvo
[slider kj_observeKey:@"progress" ObserveResultBlock:^(id  _Nonnull newValue, id  _Nonnull oldValue) {
    NSLog(@"%@",newValue);
}];
[slider2 kj_observeKey:@"progress" ObserveResultBlock:^(id  _Nonnull newValue, id  _Nonnull oldValue) {
    NSLog(@"---%@",newValue);
}];
备注:本文用到的部分函数方法和Demo,均来自三方库KJCategories,如有需要的朋友可自行pod 'KJCategories'引入即可

自定义渐变色滑杆介绍就到此完毕,后面有相关再补充,写文章不容易,还请点个小星星传送门

相关文章

网友评论

    本文标题:iOS UISlider自定义渐变色滑杆

    本文链接:https://www.haomeiwen.com/subject/hqcdiktx.html