前言

这边文章主要 是写

一、半圆弧型滑块的设计

最近项目中需要用到半圆弧形滑块,其作用和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半弧形滑动条的更多相关文章

  1. Android 拖动条/滑动条控件、星级评分控件

    ProgressBar有2个子控件: SeekBar   拖动条控件 RatingBar   星级评分控件 1.拖动条控件 <SeekBar android:layout_width=" ...

  2. 【JavaScript吉光片羽】--- 滑动条

    灯光的亮度控制需要一个滑动条,先借用lamp源码中Bar: var Bar = function (opt) { var defaults = { $id: "", // 进度条d ...

  3. MFC 滑动条的重绘

    MFC自带的滑动条的样子是这样的. 比较难看,所以需要重绘下,重绘后的样子是这样的. 代码如下: CustomSliderCtr.h #pragma once // CCustomSliderCtr ...

  4. 实现滑动条与表单中的input中的value交互

    最近在写一个考试系统的项目,遇到一些比较有意思的小知识,在这里分享给大家 下面是一个滑动条与input中的value值的交互,即滑动条的颜色会跟随给定input的value值实时变化,虽然表单中的ra ...

  5. 自定义scrollview右侧的滑动条

    在做这个功能之前我其实是拒绝的,为什么这么说呢,因为我怕麻烦啊!(开玩笑的,怕麻烦就不做程序员了) 很久没有写博客,这次刚好项目中有个有趣的东西,想拿出来分享一下,希望能帮到某些小伙伴. 首先说说需求 ...

  6. ViewPager+Fragment再探:和TAB滑动条一起三者结合

    Fragment前篇: <Android Fragment初探:静态Fragment组成Activity> ViewPager前篇: <Android ViewPager初探:让页面 ...

  7. Slider插件(滑动条,拉链)

    Slider插件(滑动条,拉链) 下载地址:http://files.cnblogs.com/elves/Slider.rar 提示:微软AJAX插件中也带此效果!

  8. OpenCV学习笔记——滑动条开关

    由于opencv库中并没有专门为开关而设的函数,可以用滑动条做开关 代码: #include<highgui.h> #include<cv.h> int g_switch_va ...

  9. VC++ 中滑动条(slider控件)使用 [转+补充]

    滑动控件slider是Windows中最常用的控件之一.一般而言它是由一个滑动条,一个滑块和可选的刻度组成,用户可以通过移动滑块在相应的控件中显示对应的值.通常,在滑动控件附近一定有标签控件或编辑框控 ...

随机推荐

  1. Unicode浅析——调用科大讯飞语音合成接口(日语)所遇到的天坑

    如题,最近做的项目需要调用科大讯飞的语音合成接口,将日文合成日语.然后坑爹的是跟我对接的那一方直接扔过来一份接口文档,里面并未提及日语合成所需要的参数.中文.英文合成倒是没问题,就这个日语合成的音频始 ...

  2. EasyUI下拉框级联

    EasyUI用来实现后台界面还是可以的,毕竟面对的是小众群体而非广大的用户,简单为美.这里想聊的功能是一种下拉框的联动,比如我选中了下拉框A的某一项,那么下拉框B的选项就是甲乙丙丁,如果我选了A的另一 ...

  3. 阶段5 3.微服务项目【学成在线】_day18 用户授权_19-微服务之间认证-Feign 拦截器

    4.2 Feign 拦截器 4.2.1 定义Feign拦截器 微服务之间使用feign进行远程调用,采用feign拦截器实现远程调用携带JWT. 在common工程添加依赖: <dependen ...

  4. 使用 ServiceStack.Text 序列化 json的实现代码

    相信做 .net 开发的朋友经常会遇到 json 序列化这样的需要,今天发篇文章总结下自己使用ServiceStack.Text 来序列化 json.它的速度比 Newtonsoft.Json 快很多 ...

  5. [CareerCup] 2. Bomberman 炸弹人

    We have a 2D grid. Each cell is either a wall, an enemy or empty. For example (0-empty, X-enemy, Y-w ...

  6. EasyNetQ使用(六)【多态发布和订阅,消息版本控制】

    你能够订阅一个接口,然后发布基于这个接口的实现. 让我们看下一个示例.我有一个接口IAnimal和两个实现Cat和Dog: public interface IAnimal { string Name ...

  7. (转)华为 安卓手机在MAC系统下 ADB 识别

    使用MACOS发现在Android开发环境完整的情况下,接入小米,SAMSUNG,HTC,ZTE等手机都可以自动识别,如果暂时不能识别,只需要在 adb_usb.ini 中设置之后也可以识别,并可以在 ...

  8. 移动端自动化测试之adb常用命令

    今天我们来聊聊自动化测试过程中常用的adb命令. 简介 首先介绍下什么是adb,adb全称叫“android debug bridge”,翻译过来就叫调试桥,通过命令行指令,可让你与移动端设备进行相互 ...

  9. 个人总结2019 ASP.NET面试题

    1.什么是面向对象? 面向对象就是把一个人或事务的属性,比如名字,年龄这些定义在一个实体类里面.存和取的时候直接使用存取实体类就把这个人的名字,年龄这些全部存了,这个实体类就叫对象,这种思想就叫面向对 ...

  10. ML.Net Model Builder

    ML.Net Model Builder ML.NET技术研究系列1-入门篇   近期团队在研究机器学习,希望通过机器学习实现补丁发布评估,系统异常检测.业务场景归纳一下: 收集整理数据(发布相关的异 ...