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];
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/45649.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用宝塔安装一套linux开发环境

更新yum&#xff0c;并且更换阿里镜像源 删除yum文件 cd /etc/yum.repos.d/ 进入yum核心目录 ls sun.repo rm -rf * 删除之前配置的本地源 ls 配置阿里镜像源 wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo 配置扩展包 wge…

paloalto防火墙CLI修改MGT IP

怎么样通过Cli修改MGT口的IP、掩码、网关、DNS呢&#xff1f; 1&#xff09;console连接上CLi&#xff0c;输入configure进入系统视图 输入exit&#xff0c;退出到用户视图 2&#xff09;在CLI修改带外管理MGT的IP地址、掩码、网关、DNS&#xff0c;默认带外管理是开启https、…

[Elasticsearch]ES近似实时搜索的原因|ES非实时搜索的原因|ES Near real-time search

Elasticsearch-专栏&#x1f448;️ 往期回顾&#xff1a; ES单一查询定义&#x1f448;️ ES深分页问题&#x1f448;️ ES商城搜索实战&#x1f448;️ ES环境搭建:单节点模式/集群模式&#x1f448;️ ES开启认证&#x1f448;️ 近似实时搜索&#xff08;Near real-t…

FlinkModule加载HiveModule异常

HiveModule这个模块加载不出来 加在不出来这个模块&#xff0c;网上查说是要加下面这个依赖 <dependency><groupId>org.apache.flink</groupId><artifactId>flink-connector-hive_${scala.binary.version}</artifactId><version>${flink.…

移动应用安全需求分析与安全保护工程

移动应用安全威胁与需求分析 移动应用在提供便利服务的同时&#xff0c;也面临着诸多安全威胁。了解这些威胁及其防护需求&#xff0c;对于保护用户数据和维护应用的安全至关重要。以下是移动应用常见的安全威胁及其需求分析&#xff1a; 一、移动应用安全威胁 数据泄露 描述…

深度学习进阶

Transformer MHA的好处&#xff1a;Multi head attention能够让模型关注到不同的信息&#xff0c;增强表达能力&#xff0c;提高模型性能&#xff1b;时间复杂度是O(N2)&#xff0c;因为每个词都需要和其他所有词进行Attention操作&#xff0c;所以是N2。 卷积 CNN 卷积核权…

Elasticsearch基础概念

Elasticsearch 是一款开源的,ESTful风格的 分布式搜索、存储、分析引擎; 常见的使用场景 网站搜索,代码搜索等日志管理与分析,应用系统性能分析,安全指标监控等数据库同步,将数据库某个表的数据同步到elasticsearch上然后提供搜索服务 ES基本概念 文档 我们向elasticsearch存…

【活动预告】Apache IoTDB TsFile 智慧能源应用“上会”啦!

2024 年&#xff0c;站在中国数字经济产业升级和数据要素市场化建设的时代交汇点上&#xff0c;为进一步推动全球数据库产业进步&#xff0c;由中国通信标准化协会、大数据技术标准推进委员会主办的“2024 可信数据库发展大会”将于 2024 年 7 月 16-17 日&#xff0c;在北京朝…

跟着李沐学AI:Softmax回归

回归 vs 分类 回归用于估计一个连续值 分类用于预测一个离散类别 两个经典的数据集&#xff1a; MNIST数据集&#xff1a; MNIST&#xff08;Modified National Institute of Standards and Technology&#xff09;数据集是一个广泛应用于机器学习和深度学习领域的手写数字…

车载视频监控管理方案:无人驾驶出租车安全出行的保障

近日&#xff0c;无人驾驶出租车“萝卜快跑”在武汉开放载人测试成为热门话题。随着科技的飞速发展&#xff0c;无人驾驶技术已逐渐从概念走向现实&#xff0c;特别是在出租车行业中&#xff0c;无人驾驶出租车的推出将为公众提供更为安全、便捷、高效的出行服务。 视频监控技…

【Linux杂货铺】2.进程优先级

1.进程优先级基本概念 进程优先级是操作系统中用于确定进程调度顺序的一个指标。每个进程都会被分配一个优先级&#xff0c;优先级较高的进程会在调度时优先被执行。进程优先级的设定通常根据进程的重要性、紧急程度、资源需求等因素来确定。操作系统会根据进程的优先级来决定进…

免费开源的工业物联网(IoT)解决方案

什么是 IoT&#xff1f; 物联网 (IoT) 是指由实体设备、车辆、电器和其他实体对象组成的网络&#xff0c;这些实体对象内嵌传感器、软件和网络连接&#xff0c;可以收集和共享数据。 IoT 设备&#xff08;也称为“智能对象”&#xff09;范围广泛&#xff0c;包括智能恒温器等…

服务器数据出现丢失该怎样恢复?

相信在目前的互联网社会中&#xff0c;大多数的企业都离不开服务器的支持&#xff0c;企业相关的业务信息与数据都存放在服务器中&#xff0c;那当服务器出现故障导致数据信息丢失或者是损坏时&#xff0c;我们应该做出哪些措施来进行数据恢复呢&#xff1f; 当服务器出现故障时…

golang 什么是内存逃逸?

什么是内存逃逸&#xff1f; golang程序变量会携带有一组校验数据&#xff0c;用来证明它的整个生命周期是否在运行时完全可知。如果变量通过了这些校验&#xff0c;它就可以在栈上分配。否则就说它 逃逸 了&#xff0c;必须在堆上分配。 能引起变量逃逸到堆上的典型情况&…

PHP企业工商年报大师微信小程序系统源码

&#x1f31f;轻松搞定年报难题&#xff01;&#x1f4bc; &#x1f680;【一键直达&#xff0c;年报不再繁琐】 还在为每年的企业工商年报而头疼吗&#xff1f;繁琐的表格、复杂的流程&#xff0c;让人望而却步&#xff1f;现在有了“企业工商年报大师”微信小程序&#xff…

Docker:基础概念、架构与网络模式详解

1.Docker的基本概念 1.1.什么是docker Docker是一个用于开发,交付和运行应用程序的开放平台.docker使您能够将应用程序域基础框架分开,以便你可以快速开发交付软件.使用docker,你可以管理你的基础架构以管理应用程序相同的方式.通过利用docker用于交付,测试和部署代码的方法,你…

vue3+antd+g2plot快速入门

创建项目 pnpm create vite选择vue和JavaScript 安装依赖 pnpm i ant-design-vue pnpm i antv/g2plot pnpm i vue-router完整代码 package.json {"name": "frontend","private": true,"version": "0.0.0","type&q…

解决Ubuntu 22.04 vscode搜狗拼音输入无法输入中文

关闭vscode 编辑~/.bashrc&#xff0c;添加以下内容 export GTK_IM_MODULExim export QT_IM_MODULExim export XMODIFIERSimfcitx source ~/.bashrc && code 重新加载环境变量后启动code&#xff0c;即可以正常使用搜狗拼音输入法了

MongoDB - 查询操作符:比较查询、逻辑查询、元素查询、数组查询

文章目录 1. 构造数据2. MongoDB 比较查询操作符1. $eq 等于1.1 等于指定值1.2 嵌入式文档中的字段等于某个值1.3 数组元素等于某个值1.4 数组元素等于数组值 2. $ne 不等于3. $gt 大于3.1 匹配文档字段3.2 根据嵌入式文档字段执行更新 4. $gte 大于等于5. $lt 小于6. $lte 小于…

java内部类的本质

定义在类内部&#xff0c;可以实现对外部完全隐藏&#xff0c;可以有更好的封装性&#xff0c;代码实现上也往往更为简洁。 内部类可以方便地访问外部类的私有变量&#xff0c;可以声明为private从而实现对外完全隐藏。 在Java中&#xff0c;根据定义的位置和方式不同&#xf…