Objective-C 自定义渐变色Slider的实现方法

 更新时间:2024年07月16日 09:56:58   作者:富春山居_ZYY(已黑化)  
系统提供UISlider,但在开发过程中经常需要自定义,本次需求内容是实现一个拥有渐变色的滑动条,且渐变色随着手指touch的位置不同改变区域,这篇文章主要介绍了Objective-C 自定义渐变色Slider,需要的朋友可以参考下

一、前情概要

系统提供UISlider,但在开发过程中经常需要自定义,本次需求内容是实现一个拥有渐变色的滑动条,且渐变色随着手指touch的位置不同改变区域,类似如下

可以使用CAGradientLayer实现渐变效果,但是发现手指滑动的快时会有不跟手的情况。我们可以重写左侧有渐变色的UIView的drawRect: 方法来绘制渐变色

二、具体实现

左侧的渐变色UIView
HLProgressView.h

@interface HLProgressView : UIView
@property (nonatomic, assign) CGSize viewSize;
@end

HLProgressView.m

@implementation HLProgressView
- (instancetype)initWithFrame:(CGRect)frame{
    self = [super initWithFrame:frame];
    if (self) {
    }
    return self;
}
- (void)setViewSize:(CGSize)viewSize {
    _viewSize = viewSize;
    self.frame = CGRectMake(0, 0, viewSize.width, viewSize.height);
    // setNeedsDisplay会自动调用drawRect方法
    [self setNeedsDisplay];
}
- (void)drawRect:(CGRect)rect {
    CGSize size = self.bounds.size;
    // 获取图形上下文对象CGContextRef
    CGContextRef context = UIGraphicsGetCurrentContext();
    // 创建一个颜色空间
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    // 设置的颜色 每四个元素表示一种颜色,值的范围0~1,分别表示R、G、B、透明度 
    CGFloat colors[] = {
        55.0/255.0, 180.0/255.0, 255.0/255.0, 1.0,
        55.0/255.0, 80.0/255.0, 255.0/255.0, 1.0
    };
    // 渐变的位置信息范围0~1 0表示开始的位置 1表示结束的位置
    CGFloat gradientLocations[] = {0, 1};
    // 渐变的个数
    size_t locationCount = 2;
    // 创建渐变
    CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, colors, gradientLocations, locationCount);
    // 指定渐变的开始位置和结束位置 这里设置完效果是整块区域的水平方向的渐变
    CGPoint gradientStartPoint = CGPointMake(0, size.height/2);
    CGPoint gradientEndPoint = CGPointMake(size.width, size.height/2);
    // 将渐变画到上下文中,最后一个参数表示发散的方式
    CGContextDrawLinearGradient(context, gradient, gradientStartPoint, gradientEndPoint, kCGGradientDrawsBeforeStartLocation);
    // 释放内存
    CGGradientRelease(gradient);
    CGColorSpaceRelease(colorSpace);
}
@end

滑动条
UICustomSlider.h

@interface UICustomSlider : UIView
@end

UICustomSlider.m

@interface UICustomSlider ()
@property (nonatomic, strong) HLProgressView *progressView;
@end
@implementation UICustomSlider
- (instancetype)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        self.backgroundColor = [UIColor grayColor];
        self.clipsToBounds = YES; //不显示超过父视图的内容
        self.layer.cornerRadius = 8;
        self.progressView = [[HLProgressView alloc] initWithFrame:CGRectMake(0, 0, 140, 44)];
        [self addSubview:self.progressView];
    }
    return self;
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    CGPoint point = [touches.anyObject locationInView:self];
    self.progressView.viewSize = CGSizeMake(point.x, self.bounds.size.height);
}
- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    CGPoint point = [touches.anyObject locationInView:self];
    self.progressView.viewSize = CGSizeMake(point.x, self.bounds.size.height);
}
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    CGPoint point = [touches.anyObject locationInView:self];
    self.progressView.viewSize = CGSizeMake(point.x, self.bounds.size.height);
}
@end

调用滑动条
ViewController.m

#import "GradientSlider.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    UICustomSlider *customSlider = [[UICustomSlider alloc] initWithFrame:CGRectMake(20, 100, 280, 44)];
    [self.view addSubview:customSlider];
}

到此这篇关于Objective-C 自定义渐变色Slider的文章就介绍到这了,更多相关Objective-C 自定义渐变色内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • IOS中html5上传图片方向问题解决方法

    IOS中html5上传图片方向问题解决方法

    这篇文章主要介绍了IOS中html5上传图片方向问题解决方法的相关资料,需要的朋友可以参考下
    2016-01-01
  • iOS开发教程之APP内部切换语言的实现方法

    iOS开发教程之APP内部切换语言的实现方法

    这篇文章主要给大家介绍了关于iOS开发教程之APP内部切换语言的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-02-02
  • IOS开发 UIAlertController详解及实例代码

    IOS开发 UIAlertController详解及实例代码

    这篇文章主要介绍了 IOS开发 UIAlertController详解及实例代码的相关资料,需要的朋友可以参考下
    2016-12-12
  • IOS 获取已连接的wifi信息的实现代码

    IOS 获取已连接的wifi信息的实现代码

    这篇文章主要介绍了IOS 获取已连接的wifi信息的实现代码的相关资料,这里提供实现代码帮助大家学习理解这部分内容,需要的朋友可以参考下
    2017-08-08
  • ios利用RunLoop原理实现去监控卡顿实例详解

    ios利用RunLoop原理实现去监控卡顿实例详解

    这篇文章主要为大家介绍了ios利用RunLoop原理实现去监控卡顿实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • iOS文件预览分享小技能示例

    iOS文件预览分享小技能示例

    这篇文章主要为大家介绍了iOS文件预览分享小技能示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • IOS 粒子系统 (CAEmitterLayer)实例详解

    IOS 粒子系统 (CAEmitterLayer)实例详解

    这篇文章主要介绍了IOS 粒子系统 (CAEmitterLayer)实例详解的相关资料,需要的朋友可以参考下
    2016-09-09
  • ios开发中时间转换的方法集锦

    ios开发中时间转换的方法集锦

    这篇文章主要介绍了ios开发中时间转换的方法集锦,需要的朋友可以参考下
    2015-05-05
  • Swift项目集成QQ授权登录

    Swift项目集成QQ授权登录

    这篇文章主要介绍了Swift项目集成QQ授权登录的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-11-11
  • iOS开发实战之Label全方位对齐的轻松实现

    iOS开发实战之Label全方位对齐的轻松实现

    这篇文章主要给大家介绍了关于iOS开发实战之轻松实现Label全方位对齐的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-10-10

最新评论