iOS 自定義控件 自定義進(jìn)度條

在日常iOS開(kāi)發(fā)中,系統(tǒng)提供的控件常常無(wú)法滿足業(yè)務(wù)功能蚁孔,這個(gè)時(shí)候需要我們實(shí)現(xiàn)一些自定義控件惋嚎。自定義控件能讓我們完全控制視圖的展示內(nèi)容以及交互操作另伍。本篇將介紹一些自定義控件的相關(guān)概念,探討自定義控件開(kāi)發(fā)的基本過(guò)程及技巧温艇。

在開(kāi)始之前我們先介紹一個(gè)類UIVew中贝,它在iOS APP中占有絕對(duì)重要的地位,因?yàn)閹缀跛械目丶际抢^承自UIView類蝎土。
UIView表示屏幕上的一個(gè)矩形區(qū)域誊涯,負(fù)責(zé)渲染區(qū)域內(nèi)的內(nèi)容蒜撮,并且響應(yīng)區(qū)域內(nèi)發(fā)生的觸摸事件段磨。
在UIView的內(nèi)部有一個(gè)CALayer,提供內(nèi)容的繪制和顯示砾隅,包括UIView的尺寸樣式债蜜。UIView的frame實(shí)際上返回的CALayer的frame寻定。
UIView繼承自UIResponder類狼速,它能接收并處理從系統(tǒng)傳來(lái)的事件,CALayer繼承自NSObject浅浮,它無(wú)法響應(yīng)事件捷枯。所以UIView與CALayer的最大區(qū)別在于:UIView能響應(yīng)事件专执,而CALayer不能淮捆。
效果圖:

屏幕快照 2016-11-11 下午5.27.40.png

//實(shí)現(xiàn)思路就是在一個(gè)view界面定制

#import <UIKit/UIKit.h>

@interface circleImageView : UIView

- (void)configeWithImage:(UIImage *)image;

@end
#import "circleImageView.h"

@interface circleImageView ()
{
    UIImageView *_imageView;
}
@end

@implementation circleImageView

-(instancetype)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        _imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, frame.size.width, frame.size.height)];
        _imageView.contentMode = UIViewContentModeScaleAspectFill;
        _imageView.layer.masksToBounds = YES;
        _imageView.layer.cornerRadius = frame.size.width/2;
        [self addSubview:_imageView];
    }
    return self;
}

- (void)configeWithImage:(UIImage *)image {
    _imageView.image = image;
}

在viewController界面設(shè)置view的位置大小

#import "ViewController.h"
#import "circleImageView.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    UIImage *image = [UIImage imageNamed:@"haha.png"];
    circleImageView * ImageView = [[circleImageView alloc] initWithFrame:CGRectMake(150, 180, 150, 150)];
    [ImageView configeWithImage:image];
    [self.view addSubview:ImageView];

}
                 

進(jìn)度條

效果圖:

Untitled11111.gif

其實(shí)進(jìn)度條就是在view界面畫圖,想要了解一些關(guān)于畫圖的東西可以查看我的前幾篇文章
第一種進(jìn)度條:
在view界面,在.h文件,我們定義4個(gè)屬性攀痊,進(jìn)度桐腌,未過(guò)滑道時(shí)的背景顏色,走過(guò)滑道的背景顏色苟径,線條的寬度

#import <UIKit/UIKit.h>

@interface JJHCircleProgressView : UIView

//進(jìn)度
@property (nonatomic)CGFloat progress;

//未過(guò)滑道時(shí)的背景顏色案站,默認(rèn)是灰色
@property (nonatomic,strong)UIColor *trackBackgroundColor;

//走過(guò)滑道的背景顏色,默認(rèn)是黃色
@property (nonatomic,strong)UIColor *trackColor;

//線條的寬度  默認(rèn)是10
@property (nonatomic,assign)float lineWidth;


@end

在.m界面蟆盐,如果要是布局控件,必須在layoutSubviews這里面寫他的位置

#import "JJHCircleProgressView.h"

@interface JJHCircleProgressView ()

@property (strong, nonatomic) UILabel *progressLabel;

@end

@implementation JJHCircleProgressView

//可以在xib storyBoard  以及代碼中都可以實(shí)現(xiàn)
- (instancetype)init
{
    self = [super init];
    if (self) {
        [self commonInit];
    }
    return self;
}
- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self commonInit];
    }
    return self;
}
- (instancetype)initWithCoder:(NSCoder *)coder
{
    self = [super initWithCoder:coder];
    if (self) {
        [self commonInit];
    }
    return self;
}



//設(shè)置各種屬性遭殉,以及把label添加上
- (void)commonInit {
    _lineWidth = 10.0;
    _trackBackgroundColor = [UIColor grayColor];
    _trackColor = [UIColor yellowColor];
}

//要是布局控件石挂,必須在這里面寫他的位置
- (void)layoutSubviews{
    [super layoutSubviews];
    UILabel *progressLabel = [[UILabel alloc] init];
    progressLabel.textColor = [UIColor blackColor];
    progressLabel.backgroundColor = [UIColor clearColor];
    progressLabel.textAlignment = NSTextAlignmentCenter;
    progressLabel.text = @"0.0%";
    _progressLabel = progressLabel;
    [self addSubview:_progressLabel];
    CGFloat slideLength = self.bounds.size.width;
    self.progressLabel.frame = CGRectMake(_lineWidth, _lineWidth, slideLength-2*_lineWidth, slideLength-2*_lineWidth);
}

//畫圖
- (void)drawRect:(CGRect)rect{
    [super drawRect:rect];
    
    
    //獲取圖形上下文
    CGContextRef contextRef = UIGraphicsGetCurrentContext();
    CGFloat slideLength = self.bounds.size.width;
    CGFloat centerX = slideLength/2;
    CGFloat centerY = slideLength/2;
    //  x,y為圓點(diǎn)坐標(biāo),radius半徑险污,startAngle為開(kāi)始的弧度痹愚,endAngle為 結(jié)束的弧度,clockwise 0為順時(shí)針蛔糯,1為逆時(shí)針拯腮。
    //    CGContextAddArc(<#CGContextRef  _Nullable c#>, <#CGFloat x#>, <#CGFloat y#>, <#CGFloat radius#>, <#CGFloat startAngle#>, <#CGFloat endAngle#>, <#int clockwise#>)
    //添加背景軌道
    CGContextAddArc(contextRef, centerX, centerY, (slideLength - _lineWidth)/2, 0, 2 * M_PI, 0);
    

    //設(shè)置背景的寬度
    CGContextSetLineWidth(contextRef, _lineWidth);
    //設(shè)置背景顏色
    [_trackBackgroundColor setStroke];
    //繪制軌道
    CGContextStrokePath(contextRef);
    
   
    
    
    //繪制進(jìn)度顏色===================
    
    //添加背景軌道
    //角度
    float endAngle = _progress * (2 * M_PI);
    CGContextAddArc(contextRef, centerX, centerY, (slideLength - _lineWidth)/2, 0, endAngle, 0);
    
    
    //設(shè)置背景的寬度
    CGContextSetLineWidth(contextRef, _lineWidth);
    //設(shè)置背景顏色
    [_trackColor setStroke];
    //繪制軌道
    CGContextStrokePath(contextRef);
}

- (void)setProgress:(CGFloat)progress {
    
    if (progress > 1 || progress < 0) return;
    _progress = progress;
    self.progressLabel.text = [NSString stringWithFormat:@"%.1f%%", progress*100];
    // 標(biāo)記為需要重新繪制, 將會(huì)在下一個(gè)繪制循環(huán)中, 調(diào)用drawRect:方法重新繪制
    [self setNeedsDisplay];
    
}
@end

第二種進(jìn)度條
在.h界面,我們定義4個(gè)屬性,進(jìn)度蚁飒,邊框線的顏色动壤,設(shè)置邊框線的寬度,里面填充的顏色 默認(rèn)是紅色

#import <UIKit/UIKit.h>

@interface JJHBreadProgressView : UIView
//進(jìn)度
@property (nonatomic)CGFloat progress;
//邊框線的顏色  默認(rèn)是灰色
@property (nonatomic)UIColor *lineColor;
//設(shè)置邊框線的寬度  默認(rèn)是10.0
@property (nonatomic)CGFloat lineWidth;
//里面填充的顏色  默認(rèn)是紅色
@property (nonatomic)UIColor *BreadClolor;
@end

在.m文件

#import "JJHBreadProgressView.h"
@implementation JJHBreadProgressView
//可以在xib storyBoard  以及代碼中都可以實(shí)現(xiàn)
- (instancetype)init
{
    self = [super init];
    if (self) {
        [self commonInit];
    }
    return self;
}
- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self commonInit];
    }
    return self;
}
- (instancetype)initWithCoder:(NSCoder *)coder
{
    self = [super initWithCoder:coder];
    if (self) {
        [self commonInit];
    }
    return self;
}


- (void)commonInit{
    _lineColor = [UIColor grayColor];
    _BreadClolor = [UIColor redColor];
    _lineWidth = 2.0;
}




- (void)drawRect:(CGRect)rect {
    [super drawRect:rect];
    
    
    //獲取圖形上下文
    CGContextRef contextRef = UIGraphicsGetCurrentContext();
    CGFloat slideLength = self.bounds.size.width;
    CGFloat centerX = slideLength/2;
    CGFloat centerY = slideLength/2;
    //  x,y為圓點(diǎn)坐標(biāo)飒箭,radius半徑狼电,startAngle為開(kāi)始的弧度,endAngle為 結(jié)束的弧度弦蹂,clockwise 0為順時(shí)針肩碟,1為逆時(shí)針。
    //    CGContextAddArc(<#CGContextRef  _Nullable c#>, <#CGFloat x#>, <#CGFloat y#>, <#CGFloat radius#>, <#CGFloat startAngle#>, <#CGFloat endAngle#>, <#int clockwise#>)
    //添加背景軌道
    CGContextAddArc(contextRef, centerX, centerY, (slideLength - _lineWidth)/2, 0, 2 * M_PI, 0);
    
    
    //設(shè)置背景的寬度
    CGContextSetLineWidth(contextRef, _lineWidth);
    //設(shè)置背景顏色
    [_lineColor setStroke];
    //繪制軌道
    CGContextStrokePath(contextRef);
    
    
    //===============劃填充物=============
    
    CGContextMoveToPoint(contextRef, centerX, centerY);
    //結(jié)束時(shí)的轉(zhuǎn)的弧度
    float endBread = _progress * 2 * M_PI;
    CGContextAddArc(contextRef, centerX, centerY, (slideLength-2*_lineWidth)/2, 0, endBread, 0);
    CGContextSetFillColorWithColor(contextRef, _BreadClolor.CGColor);
   
    CGContextFillPath(contextRef);
    
    

}
 
@end

iOS凸椿,小小白削祈,有空就寫一些小東西∧月肯定會(huì)有很多不足的地方髓抑,希望各位大神多多指教。优幸。吨拍。。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末网杆,一起剝皮案震驚了整個(gè)濱河市羹饰,隨后出現(xiàn)的幾起案子伊滋,更是在濱河造成了極大的恐慌,老刑警劉巖队秩,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件笑旺,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡馍资,警方通過(guò)查閱死者的電腦和手機(jī)筒主,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)鸟蟹,“玉大人乌妙,你說(shuō)我怎么就攤上這事∠非拢” “怎么了冠胯?”我有些...
    開(kāi)封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)锦针。 經(jīng)常有香客問(wèn)我荠察,道長(zhǎng),這世上最難降的妖魔是什么奈搜? 我笑而不...
    開(kāi)封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任悉盆,我火速辦了婚禮,結(jié)果婚禮上馋吗,老公的妹妹穿的比我還像新娘焕盟。我一直安慰自己,他們只是感情好宏粤,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布脚翘。 她就那樣靜靜地躺著,像睡著了一般绍哎。 火紅的嫁衣襯著肌膚如雪来农。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天崇堰,我揣著相機(jī)與錄音沃于,去河邊找鬼。 笑死海诲,一個(gè)胖子當(dāng)著我的面吹牛繁莹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播特幔,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼咨演,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蚯斯?” 一聲冷哼從身側(cè)響起雪标,我...
    開(kāi)封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤零院,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后村刨,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡撰茎,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年嵌牺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片龄糊。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡逆粹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出炫惩,到底是詐尸還是另有隱情僻弹,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布他嚷,位于F島的核電站蹋绽,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏筋蓖。R本人自食惡果不足惜卸耘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望粘咖。 院中可真熱鬧蚣抗,春花似錦、人聲如沸瓮下。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)讽坏。三九已至锭魔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間震缭,已是汗流浹背赂毯。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拣宰,地道東北人党涕。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像巡社,于是被迫代替她去往敵國(guó)和親膛堤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)晌该、插件肥荔、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,024評(píng)論 4 62
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,510評(píng)論 25 707
  • 爭(zhēng)取到了一個(gè)單人間燕耿,開(kāi)心的恨不得感覺(jué)一輩子都?jí)m埃落地了中符,到了晚上卻發(fā)現(xiàn)一個(gè)人誠(chéng)惶誠(chéng)恐。我還是有著人最本質(zhì)的屬性吧誉帅,群居淀散。
    綠樹(shù)底下乘涼閱讀 194評(píng)論 0 2
  • 你有沒(méi)有想過(guò)改變現(xiàn)狀档插,讓自己更有用,更有價(jià)值亚再。你現(xiàn)在擁有的生活郭膛,是你想要的嗎? 剛參加工作那會(huì)氛悬,對(duì)一切都挺很陌生则剃,...
    大黑牛閱讀 205評(píng)論 0 0
  • 本文參與#漫步青春#征文活動(dòng),作者:錢婧圆雁,本人承諾忍级,文章內(nèi)容為原創(chuàng),且未在其他平臺(tái)發(fā)布伪朽。 墨綠色的曠野上轴咱, 藍(lán)色的...
    一碗魚丸面閱讀 178評(píng)論 0 0