当前位置: 首页 > news >正文

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;// 获取图形上下文对象CGContextRefCGContextRef 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];
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 数据结构(3.9_1)——特殊矩阵的压缩存储
  • 解决打印PDF文本不清楚的处理办法
  • 如何使用HTML和JavaScript读取文件夹中的所有图片并显示RGB范围
  • 克隆某个特定的分支而不是默认分支(master)
  • 智能运维提升企业长期安全防御能力
  • elk部署springboot
  • KNN分类算法与鸢尾花分类任务
  • 在微服务架构架构中父工程中的`<dependencyManagement>`和 `<dependencies>`的区别
  • 深入理解 Elasticsearch 分页技术
  • 通过.NET6 创建的ASP.NET Core webapi项目中没有 Startup 类和ConfigureServices 方法
  • 算术运算符. 二
  • 掌握音视频转换的艺术:用FFmpeg解锁多媒体的无限可能
  • 【CSS in Depth 2 精译】第三章 文档流与盒模型 + 3.1 常规文档流
  • Python转换PDF为PowerPoint演示文件
  • 新手教学系列——高效管理MongoDB数据:批量插入与更新的实战技巧
  • 自己简单写的 事件订阅机制
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • [译] 怎样写一个基础的编译器
  • [译]如何构建服务器端web组件,为何要构建?
  • Computed property XXX was assigned to but it has no setter
  • eclipse的离线汉化
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • Fastjson的基本使用方法大全
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • Javascript弹出层-初探
  • LeetCode29.两数相除 JavaScript
  • LintCode 31. partitionArray 数组划分
  • MaxCompute访问TableStore(OTS) 数据
  • node学习系列之简单文件上传
  • PAT A1120
  • spring-boot List转Page
  • springMvc学习笔记(2)
  • webpack入门学习手记(二)
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 基于组件的设计工作流与界面抽象
  • 悄悄地说一个bug
  • 入门到放弃node系列之Hello Word篇
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 我的zsh配置, 2019最新方案
  • 小程序开发之路(一)
  • 由插件封装引出的一丢丢思考
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • scrapy中间件源码分析及常用中间件大全
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • (~_~)
  • (02)Hive SQL编译成MapReduce任务的过程
  • (1)bark-ml
  • (1)Hilt的基本概念和使用
  • (3)STL算法之搜索
  • (Matlab)使用竞争神经网络实现数据聚类
  • (rabbitmq的高级特性)消息可靠性
  • (笔试题)分解质因式
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据