iOS開發(fā)-Quartz2D的基本使用(一)

****Quearz2D****是一個二維繪制引擎,同時支持iOS和Mac系統(tǒng). Quartz 2D能完成繪制圖形 : 線條\三角形\矩形\圓\弧等 繪制文字 繪制\生成圖片(圖像) 讀取\生成PDF 截圖\裁剪圖片片 自定義UI控件.
===為了便于搭建美觀的UI界面,iOS提供了UIKit框架,??有各種各樣的UI控件 利?UIKit框架提供的控件,拼拼湊湊,能搭建和現(xiàn)實一些簡單捡鱼、常見的UI界?. 但是,有些UI界面極其復雜设捐、?且?較個性化,?普通的UI控件無法實現(xiàn),這時可以利用Quartz2D技術將控件內部的結構畫出來,自定義控件的樣子,其實,iOS中?部分控件的內容都是通過Quartz2D畫出來的,Quartz2D在iOS開發(fā)中很重要的?個價值是:自定義view(自定義UI控件) .

直線

直線是我們所研究Quartz2D繪制最簡單的一種圖形,我們怎么實現(xiàn)呢? 上代碼

-(void)line1{
    // 1 獲取圖形上下文(繪圖環(huán)境,相當于一塊畫布)
    CGContextRef cxt = UIGraphicsGetCurrentContext();//圖形上下文只能獲取不能創(chuàng)建
    // 2 描繪路徑
    CGMutablePathRef path = CGPathCreateMutable();
    //  起點
    //第一個參數(shù)是Path  第二個參數(shù)是transform 然后是橫縱坐標
    //CGPathMoveToPoint(<#CGMutablePathRef  _Nullable path#>, <#const CGAffineTransform * _Nullable m#>, <#CGFloat x#>, <#CGFloat y#>)
    CGPathMoveToPoint(path, NULL, 50, 50);
    // 終點
    CGPathAddLineToPoint(path, NULL, 200, 200);
    // 3 把路徑放到圖形上下文
    CGContextAddPath(cxt, path);
    // 4 渲染上下文cxt
    CGContextStrokePath(cxt);
}

我們調用以上方法得到的結果是


屏幕快照 2016-04-11 下午9.30.53.png

但是我們往往不只是在一個畫板上畫一條直線 有時候我們需要畫多條直線 這個時候我們就需要創(chuàng)建多個路徑, 我們借助于UIBezierPath,以第一條直線的終點 作為第二條曲線的起點繪制兩條直線

-(void)line2{
    //BezierPath(貝瑟爾路徑1)
    UIBezierPath *path = [UIBezierPath bezierPath];
    //設置起點
    [path moveToPoint:CGPointMake(50, 50)];
    //設置終點
    [path addLineToPoint:CGPointMake(200, 200)];
    //設置顏色
    [[UIColor redColor] set];
    path.lineWidth = 10;
    //渲染
    [path stroke];
    
    //BezierPath(貝瑟爾路徑2)
    UIBezierPath *path1 = [UIBezierPath bezierPath];
    //設置起點
    [path1 moveToPoint:CGPointMake(200, 200)];
    //設置終點
    [path1 addLineToPoint:CGPointMake(200, 300)];
    //設置顏色
    [[UIColor greenColor] set];
    path1.lineWidth = 10;
    //渲染
    [path1 stroke];
}

運行結果如下


多條直線

多條直線的繪制方法類似

曲線

-(void)line3{
    //獲取上下文
    CGContextRef cxt = UIGraphicsGetCurrentContext();
    //描述路徑(起點)
    CGContextMoveToPoint(cxt, 50, 50);
    // 前一組表示控制點 后一組表示終點
    //CGContextAddQuadCurveToPoint(<#CGContextRef  _Nullable c#>, <#CGFloat cpx#>, <#CGFloat cpy#>, <#CGFloat x#>, <#CGFloat y#>)  
    
    CGContextAddQuadCurveToPoint(cxt, 100, 100, 250, 50);
    // 渲染
    CGContextStrokePath(cxt);
}
曲線

在這里穿插一點: 我們在圖形繪制的過程當中 頻繁是使用CGContextRef 那么什么是圖形上下文?
圖形上下文(Graphics Context):是一個CGContextRef類型的數(shù)據(jù)
圖形上下文的作用: (1)保存繪圖信息慨畸、繪圖狀態(tài)(2)決定繪制的輸出目標(繪制到什么地?去?)(輸出目標可以是PDF?文件、Bitmap或者顯示器的窗口上)



相同的?套繪圖序列,指定不同的Graphics Context,就可將相同的圖像繪制到不同的目標上 .
****要實現(xiàn)drawRect:?法才能繪圖到view上, 因為在drawRect:?法中才能取得跟view相關聯(lián)的圖形上下文****: 所以我們以上方法的調用都是在drawRect:方法里面
****drawRect:?法被調用也是在view第一次顯示在屏幕上的時候或者是調用view的setNeedsDisplay或者setNeedsDisplayInRect:時 ****:

接下來我們在自定義的view視圖上實現(xiàn)一個畫板的效果

#import "DrawView.h"
@interface DrawView ()
{
    //起點和終點
    CGPoint _startPoint;
    CGPoint _endPoint;   
}
//數(shù)組保留每一條線
@property(nonatomic,strong)NSMutableArray *pathArr;
@end

@implementation DrawView
-(NSMutableArray *)pathArr{
    if (!_pathArr) {
        _pathArr = [NSMutableArray array];
    }
    return _pathArr;
}

我們實現(xiàn)UIview的touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event和touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event方法

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    
    //獲取起點
    _startPoint = [[touches anyObject]locationInView:self];
    
    //創(chuàng)建貝瑟爾路徑
    UIBezierPath *path = [UIBezierPath bezierPath];
    
    [path moveToPoint:_startPoint];//起點
    
    //添加到數(shù)組
    [self.pathArr addObject:path];

}
-(void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    _endPoint = [[touches anyObject]locationInView:self];
    
    //數(shù)組中最后一條線
    UIBezierPath *path = [self.pathArr lastObject];
    
    [path addLineToPoint:_endPoint];
    
    //不能直接調用 這個方法
    [self setNeedsDisplay];//setNeedsDisplay會自動調用drawRect方法
}

這個時候我們運行程序 拖動鼠標在view上 可以看到沒有任何的反應,因為我們沒有實現(xiàn)drawRect:(CGRect)rect;
我們在drawRect:(CGRect)rect方法里面寫一下代碼

     for (UIBezierPath * path in _pathArr) {
         [[UIColor redColor]set];
         path.lineWidth = 10;
         [path stroke];
     }

效果如下:



我們如果加上橡皮擦, 撤銷鍵等等,就可以實現(xiàn)真正畫板功能了,這些我們不在此操作 大家可以按興趣各自進行.
持續(xù)更新中~~~~~~~~~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末赊瞬,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌豹障,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件焦匈,死亡現(xiàn)場離奇詭異血公,居然都是意外死亡,警方通過查閱死者的電腦和手機缓熟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門累魔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人够滑,你說我怎么就攤上這事垦写。” “怎么了版述?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵梯澜,是天一觀的道長。 經常有香客問我渴析,道長晚伙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任俭茧,我火速辦了婚禮咆疗,結果婚禮上,老公的妹妹穿的比我還像新娘母债。我一直安慰自己午磁,他們只是感情好尝抖,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著迅皇,像睡著了一般昧辽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上登颓,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天搅荞,我揣著相機與錄音,去河邊找鬼框咙。 笑死咕痛,一個胖子當著我的面吹牛,可吹牛的內容都是我干的喇嘱。 我是一名探鬼主播茉贡,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼者铜!你這毒婦竟也來了腔丧?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤王暗,失蹤者是張志新(化名)和其女友劉穎悔据,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體俗壹,經...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡科汗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了绷雏。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片头滔。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖涎显,靈堂內的尸體忽然破棺而出坤检,到底是詐尸還是另有隱情,我是刑警寧澤期吓,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布早歇,位于F島的核電站,受9級特大地震影響讨勤,放射性物質發(fā)生泄漏箭跳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一潭千、第九天 我趴在偏房一處隱蔽的房頂上張望谱姓。 院中可真熱鬧,春花似錦刨晴、人聲如沸屉来。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽茄靠。三九已至茂契,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間慨绳,已是汗流浹背账嚎。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留儡蔓,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓疼邀,卻偏偏與公主長得像喂江,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子旁振,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內容