CircularSlider半弧形滑动条
前言
这边文章主要 是写
一、半圆弧型滑块的设计
最近项目中需要用到半圆弧形滑块,其作用和UISlider差不多,用于拖动改变播放音乐的播放进度。
大概样子是这样的:

特点如下:
滑动响应区域为弧环上,并且靠近滑动块,,并限制了中心区域不可滑动;
当值为0时不可再逆时针滑动,当值为最大值时,不再可顺时针滑动。
最后我自己设计一个功能,可以按固定值随意跳动,按值控制滑动条的进度。
二、成功展示

三、接入使用
1.接入
直接将CYCircularSlider.h和CYCircularSlider.m文件拖到项目中即可
2.使用
CGRect sliderFrame = CGRectMake(([UIScreen mainScreen].bounds.size.width-275)/2, ([UIScreen mainScreen].bounds.size.height-275)/2, 275,275);
_circularSlider =[[CYCircularSlider alloc]initWithFrame:sliderFrame];
[self.view addSubview:_circularSlider];
//设置代理
_circularSlider.delegate = self;
四、实现原理
整控件继承UIControl,根据值的改变重新绘制layer和改变thumb的位置;根据手势所在的位置,重新layer和改变thumb的位置,并且改变值。
1.根据所给_angle绘制圆弧
在- (void)drawRect:(CGRect)rect;
方法中绘制圆弧
在ios中,圆弧的起始弧度为140,终点弧度为40(或者说为400),圆心为(self.frame.size.width/2,self.frame.size.height/2)
,弧长对应的变量就是运动的点相对于起点旋转过的角度,而这个角度就等于M_PI/180*(_angle)
。
下面给出背景圆弧和进度圆弧的绘制方法
#pragma mark 画圆
-(void)drawRect:(CGRect)rect{
[super drawRect:rect];
//画固定的下层圆
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextAddArc(ctx, self.frame.size.width/2, self.frame.size.height/2, radius, M_PI/180*140, M_PI/180*40, 0);
[_unfilledColor setStroke];
CGContextSetLineWidth(ctx, _lineWidth);
CGContextSetLineCap(ctx, kCGLineCapButt);
CGContextDrawPath(ctx, kCGPathStroke);
CGContextAddArc(ctx, self.frame.size.width/2, self.frame.size.height/2, radius, M_PI/180*140, M_PI/180*(_angle), 0);
//画可滑动的上层圆
[_filledColor setStroke];
CGContextSetLineWidth(ctx, _lineWidth);
CGContextSetLineCap(ctx, kCGLineCapButt);
CGContextDrawPath(ctx, kCGPathStroke);
[self drawHandle:ctx];
}
在值改变的时候重新绘制layer
#pragma mark 设置进度条位置
-(void)setAngel:(int)num{
_angle = num;
[self setNeedsDisplay];
}
2.绘制thumb以及确保在圆弧上运动
#pragma mark 画thumb
-(void)drawHandle:(CGContextRef)ctx{
CGContextSaveGState(ctx);
CGPointhandleCenter = [self pointFromAngle: _angle];
[_handleColor set];
CGContextFillEllipseInRect(ctx, CGRectMake(handleCenter.x-2.5, handleCenter.y-2.5, _lineWidth+5, _lineWidth+5));
CGContextRestoreGState(ctx);
}
3.拖动控制。
主要是在UIControl的以下三个方法上做文章:
//点击开始
- (BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event;
//拖动过程中
- (BOOL)continueTrackingWithTouch:(UITouch
*)touch withEvent:(UIEvent *)event;
//拖动结束
- (void)endTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event;
实现如下:
-(BOOL)
continueTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event {
[super continueTrackingWithTouch:touch withEvent:event];
CGPoint lastPoint = [touch locationInView:self];
//用于排除点在圆外面点与圆心半径80以内的点
if ((lastPoint.x>=0&&lastPoint.x<=275)&&(lastPoint.y>=0 && lastPoint.y<=275)) {
if ((lastPoint.x<=57.5||lastPoint.x>=217.5)||(lastPoint.y<=57.5 ||lastPoint.y>=217.5)) {
[self moveHandle:lastPoint];
}
}
[self sendActionsForControlEvents:UIControlEventValueChanged];
return YES;
}
-(void)endTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event{
[super endTrackingWithTouch:touch withEvent:event];
[self.delegate senderVlueWithNum:(int8_t)roundf(_currentValue)];
}
在拖动过程中处理数据、实现重绘layer改变_angle值,在拖动结束中实现代理方法。
4.对于当值为0时,滑块不可以再逆时针滑动,当值为最大值时,滑块不可以再顺时针滑动。
只要判断_angle>40 && _angle< 140
时,将_angle
抛出就可以了。
五、尾言
1、参考资料
iOS 圆环型滑块(Circle Slider)
EFCircularSlider
2、下载传送门
CYCircularSlider下载链接
或GitHub下载链接
3.再说几句
因为实在是比较忙,而且沉不住心来写的太仔细,项目里面也有很多地方写的有问题和不够好,以后有时间再修改,有问题也请大家留言,我会改正的。
另外总得来说,弧形滑动条是就是把圆形滑动条的起始位置和终点位置经过修改,然后计算绘制弧长的参数等也要进行一些修改。
作者:cy尘缘
链接:https://www.jianshu.com/p/4083604c11b8
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
CircularSlider半弧形滑动条的更多相关文章
- Android 拖动条/滑动条控件、星级评分控件
ProgressBar有2个子控件: SeekBar 拖动条控件 RatingBar 星级评分控件 1.拖动条控件 <SeekBar android:layout_width=" ...
- 【JavaScript吉光片羽】--- 滑动条
灯光的亮度控制需要一个滑动条,先借用lamp源码中Bar: var Bar = function (opt) { var defaults = { $id: "", // 进度条d ...
- MFC 滑动条的重绘
MFC自带的滑动条的样子是这样的. 比较难看,所以需要重绘下,重绘后的样子是这样的. 代码如下: CustomSliderCtr.h #pragma once // CCustomSliderCtr ...
- 实现滑动条与表单中的input中的value交互
最近在写一个考试系统的项目,遇到一些比较有意思的小知识,在这里分享给大家 下面是一个滑动条与input中的value值的交互,即滑动条的颜色会跟随给定input的value值实时变化,虽然表单中的ra ...
- 自定义scrollview右侧的滑动条
在做这个功能之前我其实是拒绝的,为什么这么说呢,因为我怕麻烦啊!(开玩笑的,怕麻烦就不做程序员了) 很久没有写博客,这次刚好项目中有个有趣的东西,想拿出来分享一下,希望能帮到某些小伙伴. 首先说说需求 ...
- ViewPager+Fragment再探:和TAB滑动条一起三者结合
Fragment前篇: <Android Fragment初探:静态Fragment组成Activity> ViewPager前篇: <Android ViewPager初探:让页面 ...
- Slider插件(滑动条,拉链)
Slider插件(滑动条,拉链) 下载地址:http://files.cnblogs.com/elves/Slider.rar 提示:微软AJAX插件中也带此效果!
- OpenCV学习笔记——滑动条开关
由于opencv库中并没有专门为开关而设的函数,可以用滑动条做开关 代码: #include<highgui.h> #include<cv.h> int g_switch_va ...
- VC++ 中滑动条(slider控件)使用 [转+补充]
滑动控件slider是Windows中最常用的控件之一.一般而言它是由一个滑动条,一个滑块和可选的刻度组成,用户可以通过移动滑块在相应的控件中显示对应的值.通常,在滑动控件附近一定有标签控件或编辑框控 ...
随机推荐
- java-mybaits-012-mybatis-Interceptor-拦截器读写分离四种实现方案
一.概述 基本项目搭建 技术框架:spring web mvc .日志[slf4j.log4j2].mybatis.druid.jetty插件启动.mybatis-generator逆向配置生产dao ...
- 25.Flutter中的表单 Radio RadioListTile Switch SwitchListTile 以及表单组件实现一个简单的学员登记系统(下)
四.Radio.RadioListTile单选按钮组件 Radio常用属性: value单选的值. onChanged改变时触发. activeColor:选中的颜色.背景颜色 groupValue: ...
- QML使用MouseArea
1.普通使用 MouseArea { anchors.fill: parent hoverEnabled: true//为true才会触发进入信号 onClicked: { } onEntered: ...
- (四)java对象的结构和对象的访问定位
在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header).实例数据(Instance Data)和对齐填充(Padding). 一. 对象头 HotSpot虚拟机的对象 ...
- win10系统安装踩坑之路
1.一定要下载win10原版镜像.如果用迅雷下载一定要校验文件hash值的完整性,可以用fhash.exe校验,如果哈希值不一致,一定要重新下载镜像. 2.用软媒U盘启动制作启动U盘 3.重启后按F1 ...
- sqlserver如何创建链接服务器
遇到下列问题: 线上服务器A,中转服务器B,本地服务器C 数据在A上面,想在B上面操作类似 select * from [A].[database].table这样的SQL,不用去链接服务器,直接把处 ...
- 【ARTS】01_30_左耳听风-201900603~201900609
ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...
- hupu面试
1.mybatis更新一条数据时,如果某字段为空,则不更新它,使用默认值? <update id="updateProduct" parameterType="Pr ...
- C语言 - cJSON解析特定格式 含有数组array类型的数据
在ESP32中使用了cJSON库,发现很好用.最近服务器端的JSON格式越来越多样,还是有些注意点,需要做下笔记记录下来. cJSON *MAC_arry = cJSON_GetObjectItem( ...
- golang中switch用法细节
1. switch穿透-fallthrough, 如果在case语句块后增加fallthrough,则会继续执行下一个case,也叫switch穿透,默认只穿透一层 2. Type Switch: s ...