iOS圓形進(jìn)度條、帶漸變

圓形進(jìn)度條

QQ20170726-151612.gif

1,畫圓:CAShapeLayer與UIBezierPath配合使用

CAShapeLayer 是 CALayer 的子類,她比 CALayer 更靈活,可以畫出各種圖形,最簡單就是和UIBezierPath配合使用。

例(畫矩形):
矩形

@interface CycleView : UIView
@property(nonatomic,strong)CAShapeLayer * progressLayer;
@property(nonatomic,assign)float progress;
@end


#define PROGRESS_LINE_WIDTH 4 //弧線的寬度
#define RYUIColorWithRGB(r,g,b) [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:1]
#import "CycleView.h"
@implementation CycleView
       //UIBezierPath
        UIBezierPath *path = [UIBezierPath bezierPathWithRect:CGRectMake(0, 0, frame.size.width, frame.size.height)];

        //CAShapeLayer
        CAShapeLayer *shapLayer = [CAShapeLayer layer];
        shapLayer.path = path.CGPath;
        shapLayer.fillColor = [UIColor clearColor].CGColor;//圖形填充色
        UIColor *grayColor =  [UIColor colorWithRed:155/255.0 green:155/255.0 blue:155/255.0 alpha:1];
        shapLayer.strokeColor =  grayColor.CGColor;//邊線顏色
        [self.layer addSublayer:shapLayer];

那么我們開始第一步:畫出最底層的灰色圓

底層灰色圓形
        //UIBezierPath
        CGPoint arcCenter = CGPointMake(frame.size.width/2, frame.size.width/2);
        CGFloat radius = frame.size.width/2;
        //圓形路徑
        UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:arcCenter
                                                            radius:radius
                                                        startAngle:0
                                                          endAngle:M_PI*2
                                                         clockwise:YES];

        //CAShapeLayer
        CAShapeLayer *shapLayer = [CAShapeLayer layer];
        shapLayer.path = path.CGPath;
        shapLayer.fillColor = [UIColor clearColor].CGColor;//圖形填充色
        UIColor *grayColor =  [UIColor colorWithRed:155/255.0 green:155/255.0 blue:155/255.0 alpha:1];
        shapLayer.strokeColor =  grayColor.CGColor;//邊線顏色
        [self.layer addSublayer:shapLayer];

第二步:添加顏色漸變層CAGradientLayer。

CAGradientLayer是CALayer的子類,用來做漸變色的,用法請參考:
http://www.cnblogs.com/YouXianMing/p/3793913.html?utm_source=tuicool&utm_medium=referral。這篇帖子中介紹的很詳細(xì),就不做介紹了。

   //漸變圖層 漸變:RYUIColorWithRGB(140, 94, 0)   >>  RYUIColorWithRGB(229, 168, 46)   >>    RYUIColorWithRGB(140, 94, 0)
        CALayer * grain = [CALayer layer];
        [self.layer addSublayer:grain];
        //我們是兩種漸變色,所以我么要用一個(gè)grain 對象將兩個(gè)漸變圖層放到一起。
        CAGradientLayer *gradientLayer =  [CAGradientLayer layer];
        gradientLayer.frame = CGRectMake(-PROGRESS_LINE_WIDTH, -PROGRESS_LINE_WIDTH, frame.size.width/2+PROGRESS_LINE_WIDTH*2, frame.size.height+PROGRESS_LINE_WIDTH*2);
        [gradientLayer setColors:[NSArray arrayWithObjects:
                                  (id)[RYUIColorWithRGB(140, 94, 0) CGColor],
                                  (id)[RYUIColorWithRGB(229, 168, 46) CGColor], nil]];// 顏色分配
        [gradientLayer setLocations:@[@0.1,@0.9]];// 顏色分割線
        [gradientLayer setStartPoint:CGPointMake(0.05, 1)];// 起始點(diǎn)
        [gradientLayer setEndPoint:CGPointMake(0.9, 0)]; // 結(jié)束點(diǎn)
        [grain addSublayer:gradientLayer];
        
        
        CAGradientLayer * gradientLayer1 = [CAGradientLayer layer];
        gradientLayer1.frame = CGRectMake(self.bounds.size.width/2-PROGRESS_LINE_WIDTH, -PROGRESS_LINE_WIDTH, frame.size.width/2+PROGRESS_LINE_WIDTH*2, frame.size.height+PROGRESS_LINE_WIDTH*2);
        [gradientLayer1 setColors:[NSArray arrayWithObjects:
                                   (id)[RYUIColorWithRGB(229, 168, 46) CGColor],
                                   (id)[RYUIColorWithRGB(140, 94, 0) CGColor], nil]];// 顏色分配
        [gradientLayer1 setLocations:@[@0.3,@1]];// 顏色分割線
        [gradientLayer1 setStartPoint:CGPointMake(0.9, 0.05)];// 起始點(diǎn)
        [gradientLayer1 setEndPoint:CGPointMake(1, 1)];// 結(jié)束點(diǎn)
        [grain addSublayer:gradientLayer1];

第三步:設(shè)置遮罩層。

layer的遮罩層介紹:設(shè)置遮罩層:CALayer的mask屬性,設(shè)置遮罩層后,layer.mask = maskLayer;maskLayer透明的地方layer不顯示,maskLayer不透明的地方layer顯示。例:下面是遮罩層介紹,代碼和本文介紹的圓形進(jìn)度條無關(guān)。
未設(shè)置遮罩層時(shí):
     UIView *bgView = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
    [self.view addSubview:bgView];
    bgView.layer.borderColor = [UIColor blackColor].CGColor;
    bgView.layer.borderWidth = 1;
    //底層被遮罩的layer
    CAGradientLayer *gradientLayer = [CAGradientLayer layer];
    [bgView.layer addSublayer:gradientLayer];
    gradientLayer.frame = CGRectMake(0, 0, 100, 100);
    gradientLayer.backgroundColor = [UIColor redColor].CGColor;

效果圖顯示如下:

Simulator Screen Shot 2017年9月4日 15.44.03.png
設(shè)置遮罩層后
//遮罩層
    CALayer *maskLayer = [CALayer layer];
    maskLayer.frame = CGRectMake(0, 10, 100, 10);
    gradientLayer.mask = maskLayer;

效果圖:(由于未設(shè)置遮罩層顏色,故底層紅色layer不顯示)

Simulator Screen Shot 2017年9月4日 15.50.33.png
遮罩層設(shè)置顏色后:

遮罩層有顏色的地方顯示下面的layer,透明的地方反而不顯示

maskLayer.backgroundColor = [UIColor blackColor].CGColor;
Simulator Screen Shot 2017年9月4日 15.50.59.png

下面進(jìn)入正題,設(shè)置底層漸變layer,即:grain的遮蓋層。

//進(jìn)度layer 即:遮蓋layer
     _progressLayer = [CAShapeLayer layer];
     [self.layer addSublayer:_progressLayer];
     _progressLayer.path = _circlePath.CGPath;
     _progressLayer.strokeColor = [UIColor blueColor].CGColor;
     _progressLayer.fillColor = [[UIColor clearColor] CGColor];
     _progressLayer.lineWidth = PROGRESS_LINE_WIDTH;
     _progressLayer.strokeEnd = 0.f;

最后一步。設(shè)置遮罩layer:_progressLayer 的動畫。

//設(shè)置_progressLayer的進(jìn)度
-(void)setProgress:(float)progress
{
    [self startAninationWithPro:progress];
}
//根據(jù)進(jìn)度progress做動畫
-(void)startAninationWithPro:(CGFloat)pro
{
    //增加動畫
    CABasicAnimation *pathAnimation=[CABasicAnimation animationWithKeyPath:@"strokeEnd"];
    pathAnimation.duration = 3;
    pathAnimation.timingFunction=[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
    pathAnimation.fromValue=[NSNumber numberWithFloat:0.0f];
    pathAnimation.toValue=[NSNumber numberWithFloat:pro];
    pathAnimation.autoreverses=NO;
    
    pathAnimation.fillMode = kCAFillModeForwards;
    pathAnimation.removedOnCompletion = NO;
    pathAnimation.repeatCount = 1;
    [_progressLayer addAnimation:pathAnimation forKey:@"strokeEndAnimation"];
}

OVER。效果圖如下:

QQ20170726-151612.gif

代碼示例下載地址:
https://pan.baidu.com/s/1eSkuL0Y

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容