drawRect:自定義view的繪圖

繪圖的步驟:1.獲取上下文 2.創(chuàng)建路徑(描述路徑)3.把路徑添加到上下文4.渲染上下文
為什么要在drawRect里繪圖淹仑,只有在這個(gè)方法里面才能獲取到跟View的layer相關(guān)的圖形上下文
什么時(shí)候調(diào)用:當(dāng)這個(gè)view要現(xiàn)實(shí)的時(shí)候才會(huì)調(diào)用drawRect繪制圖形,一般在viewWillAppear之后(調(diào)用一次跟viewDidLoad一樣加載的時(shí)候調(diào)用一次,自己可以實(shí)現(xiàn)調(diào)用)
1.自己創(chuàng)建路徑的方法

- (void)drawRect:(CGRect)rect
{
    //1.獲取圖形上下文
    CGContextRef context=UIGraphicsGetCurrentContext();
    //2.描述路徑
    //創(chuàng)建路徑
    CGMutablePathRef path=CGPathCreateMutable();
    //設(shè)置起點(diǎn) path:給哪個(gè)路徑設(shè)置起點(diǎn)
    CGPathMoveToPoint(path, NULL, 50, 50);
    //添加一根線到某個(gè)點(diǎn)
    CGPathAddLineToPoint(path, NULL, 100, 100);
    //3.把路徑添加到上下文
    CGContextAddPath(context, path);
    //4.渲染上下文
    CGContextStrokePath(context);
}

2.用系統(tǒng)的默認(rèn)路徑繪圖

- (void)drawRect:(CGRect)rect
{
    //獲取圖形上下文
    CGContextRef context=UIGraphicsGetCurrentContext();
    //描述路徑
    CGContextMoveToPoint(context, 50, 50);
    CGContextAddLineToPoint(context, 100, 100);
    //默認(rèn)下一根線的起點(diǎn)就是上一根線的終點(diǎn)
    CGContextAddLineToPoint(context, 120, 100);
    //多根線 但是是一個(gè)路徑不能分別設(shè)置顏色(可以用自創(chuàng)建路徑或UIBezierPath)
    CGContextMoveToPoint(context, 50, 50);
    CGContextAddLineToPoint(context, 100, 100);
    
    
    //繪制曲線
    CGContextMoveToPoint(context, 80, 50);
    
    //cpx cpy :控制點(diǎn)的x,y
    //    CGContextAddQuadCurveToPoint(<#CGContextRef  _Nullable c#>, <#CGFloat cpx#>, CGFloat cpy, <#CGFloat x#>, <#CGFloat y#>)
    CGContextAddQuadCurveToPoint(context, 150, 20, 120, 100);
    
    
    
    
    //設(shè)置繪圖狀態(tài)浦妄,一定要在渲染之前
    //顏色
    [[UIColor greenColor] setStroke];
    //線寬
    CGContextSetLineWidth(context, 10);
    //設(shè)置連接樣式
    CGContextSetLineJoin(context, kCGLineJoinBevel);
    //設(shè)置頂角樣式
    CGContextSetLineCap(context, kCGLineCapRound);
    //渲染上下文
    CGContextStrokePath(context);
}

3.用UIBezierPath 繪圖

- (void)drawRect:(CGRect)rect
{
    //UIKit 已經(jīng)封裝了一些繪圖的功能
    //貝塞爾路徑
    //創(chuàng)建路徑
    UIBezierPath*path=[UIBezierPath bezierPath];
    //設(shè)置起點(diǎn)
    [path moveToPoint:CGPointMake(50, 50)];
    //添加一根線到某個(gè)點(diǎn)
    [path addLineToPoint:CGPointMake(100, 100)];
    
    path.lineWidth=10;
    [[UIColor greenColor]set];
    path.lineCapStyle=kCGLineCapRound;
    path.lineJoinStyle=kCGLineJoinBevel;
    //繪制路徑
    [path stroke];
    
    //創(chuàng)建路徑
    UIBezierPath*path1=[UIBezierPath bezierPath];
    //設(shè)置起點(diǎn)
    [path1 moveToPoint:CGPointMake(80, 50)];
    //添加一根線到某個(gè)點(diǎn)
    [path1 addLineToPoint:CGPointMake(130, 100)];
    
    path1.lineWidth=10;
    [[UIColor blueColor]set];
    path1.lineCapStyle=kCGLineCapRound;
    path1.lineJoinStyle=kCGLineJoinBevel;
    //繪制路徑
    [path1 stroke];
    
    //圓弧
    //Center:圓心
    //startAngle:開始弧度
    //clockwise:YES:順時(shí)針 NO:逆時(shí)針
    UIBezierPath *path3=[UIBezierPath bezierPathWithArcCenter:CGPointMake(100, 100) radius:100 startAngle:0 endAngle:M_PI_2 clockwise:YES];
    //添加一根線到圓心
    [path3 addLineToPoint:CGPointMake(100, 100)];
    //封閉路徑,從路徑的終點(diǎn)到起點(diǎn)
    //    [path3 closePath];
    //    [path3 stroke];
    
    //填充:必須是一個(gè)完整的封閉路徑,默認(rèn)就會(huì)自動(dòng)關(guān)閉路徑
    [path3 fill];

}

自己實(shí)現(xiàn)圓形進(jìn)度條

#import <UIKit/UIKit.h>

@interface DrawView : UIView
@property(nonatomic,assign)CGFloat progress;
@end
-(void)setProgress:(CGFloat)progress
{
    _progress=progress;
    //重繪 应又,系統(tǒng)會(huì)先創(chuàng)建與view相關(guān)的上下文,然后再調(diào)用
    [self setNeedsDisplay];
}
//注意:drawRect不能手動(dòng)調(diào)用乏苦,因?yàn)閳D形上下文我們自己創(chuàng)建不了株扛,只能由系統(tǒng)幫我們創(chuàng)建,并且傳遞給我們

- (void)drawRect:(CGRect)rect
{
    CGFloat radius=rect.size.width*0.5;
    CGPoint center=CGPointMake(radius, radius);
    //-M_PI_2 開始弧度圓的定點(diǎn)
    //_progress*M_PI*2  _progress百分多少 M_PI*2 360度
    CGFloat endA = -M_PI_2 + _progress*M_PI*2;
    UIBezierPath*path=[UIBezierPath bezierPathWithArcCenter:center radius:radius-2 startAngle:-M_PI_2 endAngle:endA clockwise:YES];
    [path stroke];
}

畫餅狀圖

- (void)drawRect:(CGRect)rect
{
    NSArray*arr=@[@36,@34,@30];
    CGFloat radius=rect.size.width*0.5;
    CGPoint center=CGPointMake(radius, radius);
    CGFloat startA=0;
    CGFloat endA=0;
    CGFloat angle=0;
    for (int i=0; i<arr.count; i++)
    {
        startA=endA;
        angle=[arr[i] doubleValue]/100.0*M_PI*2;
        endA=startA+angle;
        UIBezierPath*path=[UIBezierPath bezierPathWithArcCenter:center radius:radius-2 startAngle:startA endAngle:endA clockwise:YES];
        [path addLineToPoint:center];
        [[self colorRandom] set];
        [path fill];
    }
}
-(UIColor*)colorRandom
{
    CGFloat r=arc4random_uniform(256)/255.0;
    CGFloat g=arc4random_uniform(256)/255.0;
    CGFloat b=arc4random_uniform(256)/255.0;
    return [UIColor colorWithRed:r green:g blue:b alpha:1.0];
}

畫柱狀圖

- (void)drawRect:(CGRect)rect
{
    NSArray*arr=@[@36,@34,@30];
    CGFloat w=rect.size.width/(2*arr.count-1);
    CGFloat x=0;
    CGFloat y=0;
    CGFloat h=0;
    for (int i=0; i<arr.count; i++)
    {
        x=2*w*i;
        h=[arr[i] floatValue]/100.0 *rect.size.height;
        y=rect.size.height-h;
        UIBezierPath*path=[UIBezierPath bezierPathWithRect:CGRectMake(x, y, w, h)];
        [[self colorRandom] set];
        [path fill];
    }
}
-(UIColor*)colorRandom
{
    CGFloat r=arc4random_uniform(256)/255.0;
    CGFloat g=arc4random_uniform(256)/255.0;
    CGFloat b=arc4random_uniform(256)/255.0;
    return [UIColor colorWithRed:r green:g blue:b alpha:1.0];
}

NSTimer

//NSTimer很少用于繪畫邑贴,因?yàn)檎{(diào)度優(yōu)先級(jí)比較低席里,并不會(huì)準(zhǔn)時(shí)調(diào)用
-(void)awakeFromNib
{
//    [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(timeChange) userInfo:nil repeats:YES];
    CADisplayLink*link=[CADisplayLink displayLinkWithTarget:self selector:@selector(timeChange)];
    //想讓定時(shí)器工作,必須得要把它添加到主運(yùn)行循環(huán)
    [link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
}
//在繪圖當(dāng)中, 我們一般使用CADisplayLink.因?yàn)樗蛃etNeedsDisplay調(diào)用時(shí)機(jī)是一樣的,都是當(dāng)下一次屏幕刷新的時(shí)候調(diào)用.
//CADisplayLink:每次屏幕刷新的時(shí)候就會(huì)調(diào)用,屏幕一般一秒刷新60次
-(void)timeChange
{
    //注意:這個(gè)方法并不會(huì)馬上調(diào)用drawRect拢驾,其實(shí)這個(gè)方法只是給當(dāng)前控件添加刷新的標(biāo)記奖磁,等下一次屏幕刷新的時(shí)候才會(huì)調(diào)用drawRect
    [self setNeedsDisplay];
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市繁疤,隨后出現(xiàn)的幾起案子咖为,更是在濱河造成了極大的恐慌,老刑警劉巖稠腊,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件躁染,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡架忌,警方通過查閱死者的電腦和手機(jī)吞彤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來叹放,“玉大人饰恕,你說我怎么就攤上這事【觯” “怎么了埋嵌?”我有些...
    開封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)俱恶。 經(jīng)常有香客問我雹嗦,道長(zhǎng)范舀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任了罪,我火速辦了婚禮锭环,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘捶惜。我一直安慰自己田藐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開白布吱七。 她就那樣靜靜地躺著,像睡著了一般鹤竭。 火紅的嫁衣襯著肌膚如雪踊餐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天臀稚,我揣著相機(jī)與錄音吝岭,去河邊找鬼。 笑死吧寺,一個(gè)胖子當(dāng)著我的面吹牛窜管,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播稚机,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼幕帆,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了赖条?” 一聲冷哼從身側(cè)響起失乾,我...
    開封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎纬乍,沒想到半個(gè)月后碱茁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡仿贬,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年纽竣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茧泪。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蜓氨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出调炬,到底是詐尸還是另有隱情语盈,我是刑警寧澤,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布缰泡,位于F島的核電站刀荒,受9級(jí)特大地震影響代嗤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜缠借,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一干毅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧泼返,春花似錦硝逢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至柴罐,卻和暖如春徽缚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背革屠。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工凿试, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人似芝。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓那婉,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親党瓮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子详炬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

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

  • Core Graphics Framework是一套基于C的API框架,使用了Quartz作為繪圖引擎麻诀。它提供了低...
    ShanJiJi閱讀 1,534評(píng)論 0 20
  • Quartz2D以及drawRect的重繪機(jī)制字?jǐn)?shù)1487 閱讀21 評(píng)論1 喜歡1一痕寓、什么是Quartz2D Q...
    PurpleWind閱讀 771評(píng)論 0 3
  • 本章中迄今為止的繪制實(shí)施例中大多會(huì)產(chǎn)生一個(gè)UIImage對(duì)象,主要是通過調(diào)用UIGraphicsBeginImag...
    shenzhenboy閱讀 1,368評(píng)論 0 4
  • 一家制造電冰箱的大公司的經(jīng)理來到警察局報(bào)案:“有個(gè)20多歲的年輕人冒充我公司的推銷員蝇闭,幾天便賺了十幾萬美元呻率,...
    卓奇閱讀 139評(píng)論 0 0
  • 1)搶紅包后 貓大神說:搶了紅包后逻悠,基本的素質(zhì)是要謝謝發(fā)紅包的元践。 老妖婆立刻發(fā)圈:搶了紅包,一聲不吭童谒,跟沒搶一樣淡...
    死侃腦殼的老妖婆閱讀 438評(píng)論 14 10