Quartz2D繪圖

  • Quartz 2D的功能
  • 繪制圖形:線條、三角形、矩形倦始、圓王浴、弧等脆炎。
  • 繪制文字
  • 繪制\生成圖片(圖像)
  • 讀取\生成PDF
  • 截圖
  • 自定義UI控件

  • 使用步驟
  • 獲取一個(gè)與視圖相關(guān)的上下文
  • 創(chuàng)建一個(gè)可變路徑(本身是有一個(gè)默認(rèn)路徑的)
    1.創(chuàng)建路徑
    2.設(shè)置路徑起點(diǎn)
    3.增加路徑內(nèi)容
  • 將路徑添加到上下文
  • 設(shè)置上下文狀態(tài)
    1.設(shè)置邊線顏色
    2.設(shè)置填充顏色
    3.設(shè)置線寬
    4.設(shè)置線段連接樣式
    5.設(shè)置線段首位樣式
    6.設(shè)置虛線樣式
  • 繪制路徑
  • 釋放路徑

繪制圖形

- (void)drawRect:(CGRect)rect
{
   // [self drawLine];
   // [self drawLine_2];
   // [self drawRect];
   // [self drawRect_2];
   // [self drawArc];
   // [self drawCircle];
   // [self drawGradient];
   // [self drawText];
   // [self drawImage];
    UIImageView *imageView = [[UIImageView alloc] initWithImage:[self createImage]];
    [self addSubview:imageView];
}
- (void)drawLine{
    /*
     當(dāng)前視圖上下文
     */
    CGContextRef context = UIGraphicsGetCurrentContext(); //獲取視圖上下文
    /*
     構(gòu)建路徑
     */
    CGMutablePathRef path = CGPathCreateMutable();       //創(chuàng)建路徑
    CGPathMoveToPoint(path, NULL, 50, 50);               //設(shè)置路徑起點(diǎn)
    CGPathAddLineToPoint(path, NULL, 50, 420);           //路徑內(nèi)容
    CGPathAddLineToPoint(path, NULL, 270, 420);
    CGPathAddLineToPoint(path, NULL, 270, 50);
    CGPathCloseSubpath(path);                            //關(guān)閉路徑
    /*
     將路徑添加到上下文
     */
    CGContextAddPath(context, path);
    /*
     設(shè)置上下文狀態(tài)
     */
    CGContextSetRGBStrokeColor(context, 1, 0, 0, 1);     //設(shè)置邊線顏色
    CGContextSetRGBFillColor(context, 0, 0, 1, 1);       //設(shè)置填充顏色
    CGContextSetLineWidth(context, 10);                  //設(shè)置線寬
    CGContextSetLineJoin(context, kCGLineJoinBevel);     //設(shè)置線段連接樣式
    CGContextSetLineCap(context, kCGLineCapSquare);      //設(shè)置線段首位樣式
    CGFloat lengths[] = {20,100};
    CGContextSetLineDash(context, 100, lengths, 2);      //設(shè)置虛線
    /*
     繪制路徑
     */
    CGContextDrawPath(context, kCGPathEOFill);
    /*
     釋放路徑(如果創(chuàng)建對象的函數(shù)中包含create,copy或者retain字樣氓辣,就需要釋放秒裕!)
     */
    CGPathRelease(path);
}

- (void)drawLine_2
{
    /*
     當(dāng)前視圖上下文
     */
    CGContextRef context = UIGraphicsGetCurrentContext();  //獲取視圖上下文
    /*
     構(gòu)建路徑
     */
    CGContextBeginPath(context);
    CGContextMoveToPoint(context, 50, 50);
    
    CGContextAddLineToPoint(context, 100, 100);
    CGContextAddLineToPoint(context, 150, 50);
    /*
     保存當(dāng)前上下文
     */
    CGContextSaveGState(context);
    /*
     設(shè)置上下文狀態(tài)
     */
    CGContextSetRGBStrokeColor(context, 1, 0, 0, 1);        //設(shè)置邊線顏色
    CGContextSetLineWidth(context, 10);                     //設(shè)置線寬
    CGContextSetLineJoin(context, kCGLineJoinBevel);        //設(shè)置線段連接樣式
    CGContextSetLineCap(context, kCGLineCapSquare);         //設(shè)置線段首位樣式
    /*
     繪制路徑
     */
    CGContextStrokePath(context);
    /*
     恢復(fù)上下文
     */
    CGContextRestoreGState(context);
    /*
     再次繪制
     */
    CGContextSetRGBStrokeColor(context, 0, 0, 1, 1);
    CGContextMoveToPoint(context, 50, 50);
    CGContextAddLineToPoint(context, 100, 100);
    CGContextAddLineToPoint(context, 150, 50);
    CGContextStrokePath(context);
}

- (void)drawRect
{
    CGContextRef context = UIGraphicsGetCurrentContext();  //獲取視圖上下文
    CGContextAddRect(context, CGRectMake(50, 50, 100, 100));
    CGContextFillPath(context);
}

- (void)drawRect_2
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    [[UIColor redColor] setFill];
    [[UIColor darkGrayColor] setStroke];
    CGContextFillRect(context, CGRectMake(50, 50, 100, 100));
    CGContextStrokeRect(context, CGRectMake(50, 50, 100, 100));
}

- (void)drawArc
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    
    [[UIColor redColor] set];
    /*
     添加圓弧
     */
    CGContextAddArc(context, 160, 230, 100, 0, M_PI_2, 0);
    /*
     繪制路徑
     */
    CGContextStrokePath(context);
}

- (void)drawCircle
{
    CGContextRef context =  UIGraphicsGetCurrentContext();
    
    [[UIColor greenColor] setFill];
    
    CGContextAddEllipseInRect(context, CGRectMake(50, 50, 200, 200));
    
    CGContextFillPath(context);
}

- (void)drawGradient
{
    // 1. 定義漸變引用CGGradientRef
    CGGradientRef gradient;
    // 2. 定義色彩空間引用
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    // 3. 定義漸變顏色組件
    //   每四個(gè)數(shù)一組,分別對應(yīng)r,g,b,透明度
    CGFloat components[8] = {1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0};
    // 4. 定義顏色漸變位置
    // 第一個(gè)顏色開始漸變的位置
    // 第二個(gè)顏色結(jié)束漸變的位置
    CGFloat locations[2] = {0, 1};
    
    // 5. 創(chuàng)建顏色漸進(jìn)
    gradient = CGGradientCreateWithColorComponents(colorSpace, components, locations, 2);
    
    // 6. 創(chuàng)建貝塞爾路徑钞啸,是OC的几蜻,如果只是制定了漸變,沒有指定剪切路徑体斩,就是整個(gè)視圖的漸變
    UIBezierPath *path = [UIBezierPath bezierPathWithRect:CGRectMake(50, 50, 200, 200)];
    // 7. 添加剪切路徑
    [path addClip];
    
    // 8. 繪制線性漸進(jìn)
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextDrawLinearGradient(context, gradient, CGPointMake(50, 50), CGPointMake(200, 50), kCGGradientDrawsAfterEndLocation);
    
    // 9. 釋放顏色空間
    CGColorSpaceRelease(colorSpace);
    // 10. 釋放漸變引用
    CGGradientRelease(gradient);
}

- (void)drawText
{
    NSString *text = @"I Love you!I Love you!I Love you!I Love you!I Love you!I Love you!I Love you!I Love you!I Love you!";
    
    NSLog(@"%@",[UIFont familyNames]);
    
    // 使用set既指定邊框顏色梭稚,又指定填充顏色
    [[UIColor redColor]set];
    
    UIFont *font = [UIFont fontWithName:@"Marker Felt" size:30];
    [text drawAtPoint:CGPointMake(50, 50) withFont:font];
    
    CGRect rect = CGRectMake(50, 200, 200, 200);
    [[UIColor blueColor]set];
    UIRectFill(rect);
    
    [[UIColor redColor]set];
    // 只能用居中、左絮吵、右對齊
    [text drawInRect:rect withFont:font lineBreakMode:NSLineBreakByWordWrapping alignment:NSTextAlignmentCenter];
}

- (void)drawImage
{
    UIImage *image = [UIImage imageNamed:@"1.png"];
    
    // 在指定點(diǎn)繪制
    [image drawAtPoint:CGPointMake(50, 50)];
    // 會拉伸
    [image drawInRect:CGRectMake(0, 0, 320, 460)];
    // 平鋪
    [image drawAsPatternInRect:CGRectMake(0, 0, 320, 460)];
}

- (UIImage *)createImage
{
    // 1. 獲得圖像相關(guān)的上下文
    // 獲得圖像上下文的時(shí)候弧烤,需要指定上下文大小
    UIGraphicsBeginImageContext(CGSizeMake(320, 200));
    
    // 2. 繪制圖像
    UIImage *image = [UIImage imageNamed:@"1.png"];
    [image drawInRect:CGRectMake(0, 0, 320, 200)];
    
    // 3. 寫水印文字
    NSString *text = @"水印文字";
    // [[UIColor whiteColor]set];
    // 新建一個(gè)UIColor
    UIColor *color = [UIColor redColor];
    [color set];
    
    [text drawInRect:CGRectMake(0, 170, 300, 20) withFont:[UIFont systemFontOfSize:12] lineBreakMode:NSLineBreakByWordWrapping alignment:NSTextAlignmentRight];
    
    // 從圖像上下文中獲得當(dāng)前繪制的結(jié)果,并生成圖像
    UIImage *result =  UIGraphicsGetImageFromCurrentImageContext();
    
    // 4. 關(guān)閉上下文
    UIGraphicsEndImageContext();
    
    // 5. 把圖像歸檔蹬敲,可以用這個(gè)方法來做縮略圖
    // NSArray *documents = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    // NSString *path = [documents[0]stringByAppendingPathComponent:@"image.png"];
    
    NSString *path = @"/Users/apple/Desktop/image.png";
    
    NSData *imageData = UIImagePNGRepresentation(result);
    [imageData writeToFile:path atomically:YES];
    
    return result;
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末暇昂,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子伴嗡,更是在濱河造成了極大的恐慌急波,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瘪校,死亡現(xiàn)場離奇詭異澄暮,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)阱扬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門泣懊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人价认,你說我怎么就攤上這事嗅定。” “怎么了用踩?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長忙迁。 經(jīng)常有香客問我脐彩,道長,這世上最難降的妖魔是什么姊扔? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任惠奸,我火速辦了婚禮,結(jié)果婚禮上恰梢,老公的妹妹穿的比我還像新娘佛南。我一直安慰自己梗掰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布嗅回。 她就那樣靜靜地躺著及穗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪绵载。 梳的紋絲不亂的頭發(fā)上埂陆,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天,我揣著相機(jī)與錄音娃豹,去河邊找鬼焚虱。 笑死,一個(gè)胖子當(dāng)著我的面吹牛懂版,可吹牛的內(nèi)容都是我干的鹃栽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼躯畴,長吁一口氣:“原來是場噩夢啊……” “哼民鼓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起私股,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤摹察,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后倡鲸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體供嚎,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年峭状,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了克滴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡优床,死狀恐怖劝赔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情胆敞,我是刑警寧澤着帽,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站移层,受9級特大地震影響仍翰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜观话,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一予借、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦灵迫、人聲如沸秦叛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挣跋。三九已至,卻和暖如春利凑,著一層夾襖步出監(jiān)牢的瞬間浆劲,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工哀澈, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留牌借,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓割按,卻偏偏與公主長得像膨报,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子适荣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評論 2 355

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

  • 介紹: 1.什么是Quartz2D? 他是一個(gè)二維的繪圖引擎,同時(shí)支持iOS和Mac系統(tǒng) 2.Quartz2D能完...
    木木小林醬閱讀 1,015評論 2 3
  • 本文轉(zhuǎn)載自:http://southpeak.github.io/2014/11/16/quartz2d-3/ 路...
    idiot_lin閱讀 471評論 0 0
  • Core Graphics Framework是一套基于C的API框架现柠,使用了Quartz作為繪圖引擎。它提供了低...
    ShanJiJi閱讀 1,534評論 0 20
  • 總想找一個(gè)人說說話 可是 和陌生人又不知道聊什么 總感覺 網(wǎng)上的一切都是虛擬的 所以 才能暢所欲言 才能說平時(shí)不敢...
    凌皎閱讀 161評論 0 0
  • 浮動元素的特征弛矛,對于父容器够吩、其他浮動元素、普通元素和文字分別都有什么影響丈氓? 對于父容器 浮動元素會生成一個(gè)塊級框周循,...
    白柏更好閱讀 171評論 0 0