ios繪圖基礎(chǔ)

屏幕快照 2017-03-07 下午3.58.21.png

本文demo下載

ios常見(jiàn)的圖形繪制

  • 畫(huà)線(xiàn)
  • 畫(huà)圓勇婴、圓弧
  • 畫(huà)矩形,畫(huà)橢圓,多邊形
  • 畫(huà)圖片
  • 畫(huà)文字

1:ios繪圖基礎(chǔ)

幾個(gè)基本的概念

context:上下文傍菇,ios繪圖的方法都需要傳一個(gè)上下文context絮重,這個(gè)context在重寫(xiě)uiview的drawRect的方法里調(diào)用UIGraphicsGetCurrentContext()獲取
path:路徑惋啃,ios繪圖可以想象為你拿著一支筆去畫(huà)圖碴开,畫(huà)幾條線(xiàn)或幾個(gè)點(diǎn)從而形成一個(gè)路徑毅该,之后可以利用理解去填色或者描邊
stroke,fill 描邊和填充博秫,每個(gè)路徑都需要填充或者描邊后才能在視圖中看見(jiàn)潦牛,他們都各自有很多樣式可以設(shè)置,常見(jiàn)的有顏色挡育、粗細(xì)巴碗、漸變,連接樣式等等即寒。
畫(huà)圖可以使用默認(rèn)路徑畫(huà)橡淆,或者單獨(dú)創(chuàng)建path畫(huà)圖召噩,對(duì)應(yīng)畫(huà)圖的api并不完全相同,是兩組名稱(chēng)相似的api逸爵,兩組pi常用的方法如下

CGContextMoveToPoint設(shè)置起點(diǎn)
CGContextClosePath 連接起點(diǎn)和當(dāng)前點(diǎn)
CGPathCreateMutable 類(lèi)似于 CGContextBeginPath
CGPathMoveToPoint 類(lèi)似于 CGContextMoveToPoint
CGPathAddLineToPoint 類(lèi)似于 CGContextAddLineToPoint
CGPathAddCurveToPoint 類(lèi)似于 CGContextAddCurveToPoint
CGPathAddEllipseInRect 類(lèi)似于 CGContextAddEllipseInRect
CGPathAddArc 類(lèi)似于 CGContextAddArc
CGPathAddRect 類(lèi)似于 CGContextAddRect
CGPathCloseSubpath 類(lèi)似于 CGContextClosePath
CGContextAddPath函數(shù)把一個(gè)路徑添加到graphics

畫(huà)圖步驟 1:獲取context具滴,2:設(shè)置路徑 3:填充或描邊路徑
關(guān)于填充顏色 填充顏色有3種模式,分別是1:填充筆觸师倔,就是只給路徑描邊构韵,2:根據(jù)路徑填充顏色 3:填充筆觸和顏色。填充顏色也分為非零繞數(shù)規(guī)則和奇偶規(guī)則趋艘,這個(gè)概念比較復(fù)雜難以解釋?zhuān)蠹铱梢园俣瓤纯椿蛘呋◣讉€(gè)圖試試就明白疲恢。

CGContextStrokePath(ctx); //描出路徑
CGContextFillPath(ctx) 使用非零繞數(shù)規(guī)則填充當(dāng)前路徑
CGContextDrawPath 兩個(gè)參數(shù)決定填充規(guī)則,kCGPathFill表示用非零繞數(shù)規(guī)則瓷胧,kCGPathEOFill表示用奇偶規(guī)則显拳,kCGPathFillStroke表示填充,kCGPathEOFillStroke表示描線(xiàn)搓萧,不是填充
CGContextEOFillPath 使用奇偶規(guī)則填充當(dāng)前路徑
CGContextFillRect 填充指定的矩形
CGContextFillRects 填充指定的一些矩形
CGContextFillEllipseInRect 填充指定矩形中的橢圓

2:ios常見(jiàn)的圖形繪制

(1)新建一個(gè)文件杂数,繼承UIView
(2)重寫(xiě)-(void)drawRect:(CGRect)rect; 方法

-(void)drawRect:(CGRect)rect{

    [super drawRect:rect];

    //獲取ctx
    CGContextRef ctx = UIGraphicsGetCurrentContext();

    //設(shè)置畫(huà)圖相關(guān)樣式參數(shù)

    //設(shè)置筆觸顏色
    CGContextSetStrokeColorWithColor(ctx, [UIColor blackColor].CGColor);//設(shè)置顏色有很多方法矛绘,我覺(jué)得這個(gè)方法最好用
    //設(shè)置筆觸寬度
    CGContextSetLineWidth(ctx, 2);
    //設(shè)置填充色
    CGContextSetFillColorWithColor(ctx, [UIColor purpleColor].CGColor);
    //設(shè)置拐點(diǎn)樣式
    //    enum CGLineJoin {
    //        kCGLineJoinMiter, //尖的耍休,斜接
    //        kCGLineJoinRound, //圓
    //        kCGLineJoinBevel //斜面
    //    };
    CGContextSetLineJoin(ctx, kCGLineJoinRound);
    //Line cap 線(xiàn)的兩端的樣式
    //    enum CGLineCap {
    //        kCGLineCapButt,
    //        kCGLineCapRound,
    //        kCGLineCapSquare
    //    };
    CGContextSetLineCap(ctx, kCGLineCapRound);
    //虛線(xiàn)線(xiàn)條樣式
    //CGFloat lengths[] = {10,10};

    //畫(huà)線(xiàn)
    [self drawLine:ctx];

    //畫(huà)圓、圓弧
    [self drawCircle:ctx];


    //畫(huà)矩形,畫(huà)橢圓货矮,多邊形
    [self drawShape:ctx];

    //畫(huà)圖片
    [self drawPicture:ctx];

    //畫(huà)文字
    [self drawText:ctx];

    }


2.1:畫(huà)線(xiàn)

第一個(gè)方法我寫(xiě)的比較詳細(xì)羊精,寫(xiě)了使用path的方式和直接畫(huà)線(xiàn)的方式。推薦使用path的方式畫(huà)線(xiàn)囚玫。 另外喧锦,第一個(gè)方法也寫(xiě)了移動(dòng)筆觸畫(huà)線(xiàn)和用點(diǎn)集合畫(huà)線(xiàn)。后面方法只會(huì)涉及其中一種抓督,因?yàn)榉椒ǘ急容^類(lèi)似燃少。

//畫(huà)線(xiàn)
    -(void)drawLine:(CGContextRef)ctx{

        //畫(huà)一條簡(jiǎn)單的線(xiàn)
        CGPoint points1[] = {CGPointMake(10, 30),CGPointMake(300, 30)};
        CGContextAddLines(ctx,points1, 2);


        //畫(huà)線(xiàn)方法1,使用CGContextAddLineToPoint畫(huà)線(xiàn)铃在,需要先設(shè)置一個(gè)起始點(diǎn)
        //設(shè)置起始點(diǎn)
        CGContextMoveToPoint(ctx, 50, 50);
        //添加一個(gè)點(diǎn)
        CGContextAddLineToPoint(ctx, 100,50);
        //在添加一個(gè)點(diǎn)阵具,變成折線(xiàn)
        CGContextAddLineToPoint(ctx, 150, 100);


        //畫(huà)線(xiàn)方法2
        //構(gòu)造線(xiàn)路徑的點(diǎn)數(shù)組
        CGPoint points2[] = {CGPointMake(60, 60),CGPointMake(80, 120),CGPointMake(20, 300)};
        CGContextAddLines(ctx,points2, 3);


        //利用路徑去畫(huà)一組點(diǎn)(推薦使用路徑的方式,雖然多了幾行代碼定铜,但是邏輯更清晰了)
        //第一個(gè)路徑
        CGMutablePathRef path1 = CGPathCreateMutable();
        CGPathMoveToPoint(path1, &CGAffineTransformIdentity, 0, 200);
        //CGAffineTransformIdentity 類(lèi)似于初始化一些參數(shù)
        CGPathAddLineToPoint(path1, &CGAffineTransformIdentity, 100, 250);
        CGPathAddLineToPoint(path1, &CGAffineTransformIdentity, 310, 210);
        //路徑1加入context
        CGContextAddPath(ctx, path1);
        //path同樣有方法CGPathAddLines(),和CGContextAddLines()差不多用戶(hù)阳液,可以自己試下

        //描出筆觸
        CGContextStrokePath(ctx);
    }

2.2:畫(huà)矩形,畫(huà)橢圓,多邊形

//畫(huà)矩形,畫(huà)橢圓揣炕,多邊形
-(void)drawSharp:(CGContextRef)ctx{

    CGContextSetFillColorWithColor(ctx, [UIColor redColor].CGColor);


    //畫(huà)橢圓帘皿,如果長(zhǎng)寬相等就是圓
    CGContextAddEllipseInRect(ctx, CGRectMake(0, 250, 50, 50));

    //畫(huà)矩形,長(zhǎng)寬相等就是正方形
    CGContextAddRect(ctx, CGRectMake(70, 250, 50, 50));


    //畫(huà)多邊形,多邊形是通過(guò)path完成的
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathMoveToPoint(path, &CGAffineTransformIdentity, 120, 250);
    CGPathAddLineToPoint(path, &CGAffineTransformIdentity, 200, 250);
    CGPathAddLineToPoint(path, &CGAffineTransformIdentity, 180, 300);
    CGPathCloseSubpath(path);
    CGContextAddPath(ctx, path);


    //填充
    CGContextFillPath(ctx);


}

2.3:畫(huà)圖


    //畫(huà)圖片
    -(void)drawPicture:(CGContextRef)context{
        /*圖片*/
        UIImage *image = [UIImage imageNamed:@"head.jpeg"];
        [image drawInRect:CGRectMake(10, 300, 100, 100)];//在坐標(biāo)中畫(huà)出圖片
    }

2.4:畫(huà)文字

    //畫(huà)文字
    -(void)drawText:(CGContextRef)ctx{


        //文字樣式
        UIFont *font = [UIFont systemFontOfSize:18];
        NSDictionary *dict = @{NSFontAttributeName:font,
                               NSForegroundColorAttributeName:[UIColor whiteColor]};

        [@"hello world" drawInRect:CGRectMake(120 , 350, 500, 50) withAttributes:dict];
    }

2.5:畫(huà)圓畸陡、圓弧鹰溜、貝塞爾曲線(xiàn)

畫(huà)圓和圓弧是一回事虽填,只是起點(diǎn)和終點(diǎn)位置不同,畫(huà)圓畫(huà)弧線(xiàn)主要依賴(lài)于這幾個(gè)方法 CGContextAddArc,CGContextAddArcToPoint, CGContextAddCurveToPoint,CGContextAddQuadCurveToPoint 后面兩個(gè)方法是貝塞爾二次曲線(xiàn)和三次曲線(xiàn)

//畫(huà)圓曹动、圓弧
   -(void)drawCircle:(CGContextRef)ctx{

       CGContextSetStrokeColorWithColor(ctx, [UIColor purpleColor].CGColor);

       /* 繪制路徑 方法一
        void CGContextAddArc (
        CGContextRef c,
        CGFloat x,             //圓心的x坐標(biāo)
        CGFloat y,    //圓心的x坐標(biāo)
        CGFloat radius,   //圓的半徑
        CGFloat startAngle,    //開(kāi)始弧度
        CGFloat endAngle,   //結(jié)束弧度
        int clockwise          //0表示順時(shí)針斋日,1表示逆時(shí)針
        );
        */

       //圓
       CGContextAddArc (ctx, 100, 100, 50, 0, M_PI* 2 , 0);
       CGContextStrokePath(ctx);

       //半圓
       CGContextAddArc (ctx, 100, 200, 50, 0, M_PI*2, 0);
       CGContextStrokePath(ctx);

       //繪制路徑 方法二,這方法適合繪制弧度 墓陈,端點(diǎn)p1和p2是弧線(xiàn)的控制點(diǎn)桑驱,類(lèi)似photeshop中鋼筆工具控制曲線(xiàn),還不明白請(qǐng)去了解貝塞爾曲線(xiàn)
       //    void CGContextAddArcToPoint(
       //                                CGContextRef c,
       //                                CGFloat x1,  //端點(diǎn)1的x坐標(biāo)
       //                                CGFloat y1,  //端點(diǎn)1的y坐標(biāo)
       //                                CGFloat x2,  //端點(diǎn)2的x坐標(biāo)
       //                                CGFloat y2,  //端點(diǎn)2的y坐標(biāo)
       //                                CGFloat radius //半徑
       //                                )跛蛋;

       //1/4弧度 * 4
       CGContextMoveToPoint(ctx, 200, 200);
       CGContextAddArcToPoint(ctx, 200, 100,300, 100, 100);
       CGContextAddArcToPoint(ctx, 400, 100,400, 200, 100);
       CGContextAddArcToPoint(ctx, 400, 300,300, 300, 100);
       CGContextAddArcToPoint(ctx, 200, 300,200, 200, 100);
       CGContextStrokePath(ctx);

       //貝塞爾曲線(xiàn)
       CGContextSetStrokeColorWithColor(ctx, [UIColor orangeColor].CGColor);

       //三次曲線(xiàn)函數(shù)
       //void CGContextAddCurveToPoint (
       //                               CGContextRef c,
       //                               CGFloat cp1x, //控制點(diǎn)1 x坐標(biāo)
       //                               CGFloat cp1y, //控制點(diǎn)1 y坐標(biāo)
       //                               CGFloat cp2x, //控制點(diǎn)2 x坐標(biāo)
       //                               CGFloat cp2y, //控制點(diǎn)2 y坐標(biāo)
       //                               CGFloat x,  //直線(xiàn)的終點(diǎn) x坐標(biāo)
       //                               CGFloat y  //直線(xiàn)的終點(diǎn) y坐標(biāo)
       //                               );

       CGContextMoveToPoint(ctx, 200, 200);
       CGContextAddCurveToPoint(ctx, 200, 0, 300, 200, 400, 100);
       CGContextStrokePath(ctx);

       //三次曲線(xiàn)可以畫(huà)圓弧熬的,比如這里畫(huà)一條之前用CGContextAddArcToPoint構(gòu)成的圓弧
       CGContextMoveToPoint(ctx, 200, 200);
       CGContextAddCurveToPoint(ctx, 200, 100, 300, 100, 300 ,100);
       CGContextStrokePath(ctx);
       //二次曲線(xiàn)函數(shù)
       //void CGContextAddQuadCurveToPoint (
       //                                   CGContextRef c,
       //                                   CGFloat cpx,  //控制點(diǎn) x坐標(biāo)
       //                                   CGFloat cpy,  //控制點(diǎn) y坐標(biāo)
       //                                   CGFloat x,  //直線(xiàn)的終點(diǎn) x坐標(biāo)
       //                                   CGFloat y  //直線(xiàn)的終點(diǎn) y坐標(biāo)
       //                                   );

       CGContextMoveToPoint(ctx, 100, 100);
       CGContextAddQuadCurveToPoint(ctx, 200, 0, 300, 150);
       CGContextStrokePath(ctx);

   }

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市赊级,隨后出現(xiàn)的幾起案子押框,更是在濱河造成了極大的恐慌,老刑警劉巖理逊,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件橡伞,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡晋被,警方通過(guò)查閱死者的電腦和手機(jī)兑徘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)羡洛,“玉大人挂脑,你說(shuō)我怎么就攤上這事∮辏” “怎么了崭闲?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)威蕉。 經(jīng)常有香客問(wèn)我刁俭,道長(zhǎng),這世上最難降的妖魔是什么韧涨? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任牍戚,我火速辦了婚禮,結(jié)果婚禮上虑粥,老公的妹妹穿的比我還像新娘如孝。我一直安慰自己,他們只是感情好舀奶,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布暑竟。 她就那樣靜靜地躺著斋射,像睡著了一般育勺。 火紅的嫁衣襯著肌膚如雪但荤。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,590評(píng)論 1 305
  • 那天涧至,我揣著相機(jī)與錄音腹躁,去河邊找鬼。 笑死南蓬,一個(gè)胖子當(dāng)著我的面吹牛纺非,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赘方,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼烧颖,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了窄陡?” 一聲冷哼從身側(cè)響起炕淮,我...
    開(kāi)封第一講書(shū)人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎跳夭,沒(méi)想到半個(gè)月后涂圆,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡币叹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年润歉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颈抚。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡踩衩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出贩汉,到底是詐尸還是另有隱情九妈,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布雾鬼,位于F島的核電站萌朱,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏策菜。R本人自食惡果不足惜晶疼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望又憨。 院中可真熱鬧翠霍,春花似錦、人聲如沸蠢莺。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至锄弱,卻和暖如春考蕾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背会宪。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工肖卧, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人掸鹅。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓塞帐,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親巍沙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子葵姥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

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

  • 本篇DEMO在iOS中進(jìn)行繪圖,不管你是否了解句携,基本上就是使用的Core Graphics牌里。Core Graphi...
    莫須有戀閱讀 1,977評(píng)論 0 5
  • Core Graphics Framework是一套基于C的API框架,使用了Quartz作為繪圖引擎务甥。它提供了低...
    ShanJiJi閱讀 1,537評(píng)論 0 20
  • UIBezierPath Class Reference 譯:UIBezierPath類(lèi)封裝了Core Graph...
    鋼鉄俠閱讀 1,728評(píng)論 0 3
  • Quartz 2D是二維圖形繪制引擎,可以實(shí)現(xiàn)N多圖形圖像的操作功能挺尿,如基本路徑的繪制奏黑、透明度、描影编矾、繪制陰影熟史、透...
    起名好難_fz閱讀 424評(píng)論 0 2
  • 前幾天聽(tīng)了講課,發(fā)現(xiàn)自己確實(shí)是淺呼吸窄俏□迤ィ回到家后看了貝茨的書(shū),嘗試著腹部呼吸凹蜈,發(fā)現(xiàn)其實(shí)很簡(jiǎn)單限寞,但是自己淺呼吸已經(jīng)形成...
    茜茜gaga閱讀 168評(píng)論 0 1