CircularSlider半弧形滑動條

一者冤、半圓弧型滑塊的設(shè)計

最近項目中需要用到半圓弧形滑塊,其作用和UISlider差不多档痪,用于拖動改變播放音樂的播放進度涉枫。

大概樣子是這樣的:


效果展示

特點如下:

滑動響應(yīng)區(qū)域為弧環(huán)上,并且靠近滑動塊腐螟,愿汰,并限制了中心區(qū)域不可滑動;

當值為0時不可再逆時針滑動遭垛,當值為最大值時尼桶,不再可順時針滑動。

最后我自己設(shè)計一個功能锯仪,可以按固定值隨意跳動泵督,按值控制滑動條的進度。

二庶喜、成功展示

效果圖

三小腊、接入使用

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

//設(shè)置代理
 _circularSlider.delegate = self;

四救鲤、實現(xiàn)原理

整控件繼承UIControl,根據(jù)值的改變重新繪制layer和改變thumb的位置秩冈;根據(jù)手勢所在的位置本缠,重新layer和改變thumb的位置,并且改變值入问。

1.根據(jù)所給_angle繪制圓弧

- (void)drawRect:(CGRect)rect;方法中繪制圓弧
在ios中丹锹,圓弧的起始弧度為140,終點弧度為40(或者說為400)芬失,圓心為(self.frame.size.width/2楣黍,self.frame.size.height/2),弧長對應(yīng)的變量就是運動的點相對于起點旋轉(zhuǎn)過的角度棱烂,而這個角度就等于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 設(shè)置進度條位置

-(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;

//拖動結(jié)束

- (void)endTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event;

實現(xiàn)如下:


-(BOOL)

continueTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event {

    [super continueTrackingWithTouch:touch withEvent:event];

    CGPoint lastPoint = [touch locationInView:self];

    //用于排除點在圓外面點與圓心半徑80以內(nèi)的點

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

}

在拖動過程中處理數(shù)據(jù)颊糜、實現(xiàn)重繪layer改變_angle值哩治,在拖動結(jié)束中實現(xiàn)代理方法。

4.對于當值為0時衬鱼,滑塊不可以再逆時針滑動业筏,當值為最大值時,滑塊不可以再順時針滑動鸟赫。

只要判斷_angle>40 && _angle< 140時驾孔,將_angle拋出就可以了。

五惯疙、尾言

1翠勉、參考資料

iOS 圓環(huán)型滑塊(Circle Slider)
EFCircularSlider

2、下載傳送門

CYCircularSlider下載鏈接
GitHub下載鏈接

3.再說幾句

因為實在是比較忙,而且沉不住心來寫的太仔細,項目里面也有很多地方寫的有問題和不夠好晃财,以后有時間再修改陵且,有問題也請大家留言,我會改正的。
另外總得來說,弧形滑動條是就是把圓形滑動條的起始位置和終點位置經(jīng)過修改,然后計算繪制弧長的參數(shù)等也要進行一些修改骑脱。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市苍糠,隨后出現(xiàn)的幾起案子叁丧,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拥娄,死亡現(xiàn)場離奇詭異蚊锹,居然都是意外死亡,警方通過查閱死者的電腦和手機稚瘾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門牡昆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人摊欠,你說我怎么就攤上這事丢烘。” “怎么了些椒?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵铅协,是天一觀的道長。 經(jīng)常有香客問我摊沉,道長,這世上最難降的妖魔是什么痒给? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任说墨,我火速辦了婚禮,結(jié)果婚禮上苍柏,老公的妹妹穿的比我還像新娘尼斧。我一直安慰自己,他們只是感情好试吁,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布棺棵。 她就那樣靜靜地躺著,像睡著了一般熄捍。 火紅的嫁衣襯著肌膚如雪烛恤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天余耽,我揣著相機與錄音缚柏,去河邊找鬼。 笑死碟贾,一個胖子當著我的面吹牛币喧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播袱耽,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼杀餐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了朱巨?” 一聲冷哼從身側(cè)響起史翘,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后恶座,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體搀暑,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年跨琳,在試婚紗的時候發(fā)現(xiàn)自己被綠了自点。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡脉让,死狀恐怖桂敛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情溅潜,我是刑警寧澤术唬,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站滚澜,受9級特大地震影響粗仓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜设捐,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一借浊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧萝招,春花似錦蚂斤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至岗钩,卻和暖如春纽窟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背兼吓。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工师倔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人周蹭。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓趋艘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親凶朗。 傳聞我的和親對象是個殘疾皇子瓷胧,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時...
    歐辰_OSR閱讀 29,334評論 8 265
  • -- iOS事件全面解析 概覽 iPhone的成功很大一部分得益于它多點觸摸的強大功能揍移,喬布斯讓人們認識到手機其實...
    翹楚iOS9閱讀 2,947評論 0 13
  • 響應(yīng)者對象 在iOS中不是任何對象都能處理事件,只有繼承了UIResponder的對象才能接收并處理事件反肋。我們稱之...
    JonesCxy閱讀 693評論 0 0
  • 好奇觸摸事件是如何從屏幕轉(zhuǎn)移到APP內(nèi)的那伐?困惑于Cell怎么突然不能點擊了?糾結(jié)于如何實現(xiàn)這個奇葩響應(yīng)需求石蔗?亦或是...
    Lotheve閱讀 56,800評論 51 597
  • 今天的習(xí)慣養(yǎng)成10分制可以得8分罕邀。上午身體和情緒不受大腦控制,拖后腿养距。直到午后出去走走诉探,慢慢從低落中走出來。身體和...
    張玉蓉zyr閱讀 159評論 0 0