iOS最方便簡潔的圓形進(jìn)度條

最近整理以前寫的一些小玩意,發(fā)現(xiàn)以前寫的一個(gè)圓形進(jìn)度環(huán),覺得代碼寫的還挺簡潔的,在此分享給大家.
控件效果:

圓形進(jìn)度條
#import <UIKit/UIKit.h>

@class JWProgressView;

@protocol JWProgressViewDelegate <NSObject>

-(void)progressViewOver:(JWProgressView *)progressView;

@end

@interface JWProgressView : UIView

//進(jìn)度值0-1.0之間
@property (nonatomic,assign)CGFloat progressValue;


//內(nèi)部label文字
@property(nonatomic,strong)NSString *contentText;

//value等于1的時(shí)候的代理
@property(nonatomic,weak)id<JWProgressViewDelegate>delegate;

@end
#import "JWProgressView.h"
@interface JWProgressView ()
{
    CAShapeLayer *backGroundLayer;      //背景圖層
    CAShapeLayer *frontFillLayer;       //用來填充的圖層
    UIBezierPath *backGroundBezierPath; //背景貝賽爾曲線
    UIBezierPath *frontFillBezierPath;  //用來填充的貝賽爾曲線
    UILabel *_contentLabel;              //中間的label
}
@end


@implementation JWProgressView

@synthesize progressValue = _progressValue;
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
    if (self = [super initWithCoder:aDecoder]) {
        [self setUp];
    }
    return self;
}
- (instancetype)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame])
    {
        [self setUp];
        
    }
    return self;
    
}

//初始化創(chuàng)建圖層
- (void)setUp
{
    //創(chuàng)建背景圖層
    backGroundLayer = [CAShapeLayer layer];
    backGroundLayer.fillColor = nil;

    //創(chuàng)建填充圖層
    frontFillLayer = [CAShapeLayer layer];
    frontFillLayer.fillColor = nil;

    //創(chuàng)建中間label
    _contentLabel = [[UILabel alloc]init];
    _contentLabel.textAlignment = NSTextAlignmentCenter;
    _contentLabel.text = @"120";
    _contentLabel.font = [UIFont systemFontOfSize:15];
    _contentLabel.backgroundColor = [UIColor clearColor];
    [self addSubview:_contentLabel];
    
    [self.layer addSublayer:backGroundLayer];
    [self.layer addSublayer:frontFillLayer];
    
    //設(shè)置顏色
    frontFillLayer.strokeColor = [UIColor colorWithRed:78/255.0 green:194/255.0 blue:0/255.0 alpha:1.0].CGColor;
    _contentLabel.textColor = [UIColor colorWithRed:78/255.0 green:194/255.0 blue:0/255.0 alpha:1.0];
    backGroundLayer.strokeColor = [UIColor colorWithRed:190/255.0 green:255/255.0 blue:167/255.0 alpha:1.0].CGColor;
  
}

#pragma mark -子控件約束
-(void)layoutSubviews {

    [super layoutSubviews];
    
    CGFloat width = self.bounds.size.width;
    _contentLabel.frame = CGRectMake(0, 0, width - 4, 20);
    _contentLabel.center = CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds));
    backGroundLayer.frame = self.bounds;


    backGroundBezierPath = [UIBezierPath bezierPathWithArcCenter:CGPointMake(width/2.0f, width/2.0f) radius:(CGRectGetWidth(self.bounds)-2.0)/2.f startAngle:0 endAngle:M_PI*2
                                                       clockwise:YES];
    backGroundLayer.path = backGroundBezierPath.CGPath;
    
    
    frontFillLayer.frame = self.bounds;

    //設(shè)置線寬
    frontFillLayer.lineWidth = 2.0;
    backGroundLayer.lineWidth = 2.0;
}

#pragma mark - 設(shè)置label文字和進(jìn)度的方法
-(void)setContentText:(NSString *)contentText {

    if (_progressValue == 1) {
        
        return;
    }
    if (contentText) {
        
        _contentLabel.text = contentText;
    }
}

- (void)setProgressValue:(CGFloat)progressValue
{
    
     progressValue = MAX( MIN(progressValue, 1.0), 0.0);
     _progressValue = progressValue;
     if (progressValue == 1) {
        
        if ([self.delegate respondsToSelector:@selector(progressViewOver:)]) {
            
            [self.delegate progressViewOver:self];
        }
        return;
    }
    
    CGFloat width = self.bounds.size.width;
    
    frontFillBezierPath = [UIBezierPath bezierPathWithArcCenter:CGPointMake(width/2.0f, width/2.0f) radius:(CGRectGetWidth(self.bounds)-2.0)/2.f startAngle:-0.25*2*M_PI endAngle:(2*M_PI)*progressValue - 0.25*2*M_PI clockwise:YES];
    frontFillLayer.path = frontFillBezierPath.CGPath;
}
- (CGFloat)progressValue
{
    return _progressValue;
}

@end

因?yàn)樵陧?xiàng)目中只用到一次所以就只是做了一個(gè)格式化的控件,使用起來也非常的方便.

#import "ViewController.h"
#import "JWProgressView.h"
@interface ViewController ()<JWProgressViewDelegate>
{
    JWProgressView *progressView;
}
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    progressView = [[JWProgressView alloc]initWithFrame:CGRectMake(100, 100, 87, 85)];
    progressView.delegate = self;

    [self.view addSubview:progressView];
    [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(changeProgressValue) userInfo:nil repeats:YES];
    
}

- (void)changeProgressValue
{
    progressView.progressValue = ((int)((progressView.progressValue * 100.0f) + 1.01) % 100) / 100.0f;;
    
    progressView.contentText=[NSString stringWithFormat:@"%f",progressView.progressValue];

}

-(void)progressViewOver:(JWProgressView *)progressView {

    NSLog(@"value為1");

}

對(duì)于這種簡單并且不會(huì)在項(xiàng)目中用到很多次的控件,我的個(gè)人理解是不要在外面暴露太多的屬性,這樣會(huì)給代碼看起來很不整潔.要是讀者想要不同的顏色以及線寬,可以在控件內(nèi)部代碼中修改,屬性都有詳細(xì)的標(biāo)注.

希望這篇文章有對(duì)你實(shí)現(xiàn)圓形進(jìn)度條有所幫助.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市默刚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌政己,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泪蔫,死亡現(xiàn)場(chǎng)離奇詭異蹦狂,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)嗦明,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門笼沥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人娶牌,你說我怎么就攤上這事奔浅。” “怎么了诗良?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵汹桦,是天一觀的道長。 經(jīng)常有香客問我鉴裹,道長舞骆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任径荔,我火速辦了婚禮督禽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘总处。我一直安慰自己狈惫,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布鹦马。 她就那樣靜靜地躺著胧谈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪荸频。 梳的紋絲不亂的頭發(fā)上第岖,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音试溯,去河邊找鬼蔑滓。 笑死,一個(gè)胖子當(dāng)著我的面吹牛遇绞,可吹牛的內(nèi)容都是我干的键袱。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼摹闽,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蹄咖!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起付鹿,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤澜汤,失蹤者是張志新(化名)和其女友劉穎蚜迅,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體俊抵,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谁不,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了徽诲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刹帕。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖谎替,靈堂內(nèi)的尸體忽然破棺而出偷溺,到底是詐尸還是另有隱情,我是刑警寧澤钱贯,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布挫掏,位于F島的核電站,受9級(jí)特大地震影響秩命,放射性物質(zhì)發(fā)生泄漏砍濒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一硫麻、第九天 我趴在偏房一處隱蔽的房頂上張望爸邢。 院中可真熱鬧,春花似錦拿愧、人聲如沸杠河。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽券敌。三九已至,卻和暖如春柳洋,著一層夾襖步出監(jiān)牢的瞬間待诅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國打工熊镣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留卑雁,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓绪囱,卻偏偏與公主長得像测蹲,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鬼吵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,527評(píng)論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫扣甲、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,033評(píng)論 4 62
  • 輿論八卦的作用 想象中的現(xiàn)實(shí) 而非謊言
    3小俠閱讀 194評(píng)論 0 0
  • 南方的天氣正好 我們卻再次談起了悲傷 : 關(guān)于食鹽和面包齿椅。以及 那座我們穿行了三年的橋上 散落的時(shí)光 當(dāng)黃昏靠近 ...
    城市里的豬閱讀 422評(píng)論 6 7
  • 滿目河山空見遠(yuǎn)琉挖,不如憐取眼前人启泣。希望這世上所有良善之人,都被珍惜愛重示辈。也希望人人都有一雙慧眼寥茫,看得清這世間所有的真...
    港島汽水_閱讀 233評(píng)論 0 0