Quartz2D常用方法的簡單使用

線段的繪制

方式一

    // 1.獲取圖形上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    
    // 2.描述路徑
    // 創建路徑
    CGMutablePathRef path = CGPathCreateMutable();
    
    // 設置起點
    // path:給哪個路徑設置起點
    CGPathMoveToPoint(path, NULL, 50, 50);
    
    // 添加一根線到某個點
    CGPathAddLineToPoint(path, NULL, 200, 200);
    
    // 3.把路徑添加到上下文
    CGContextAddPath(ctx, path);
    
    // 4.渲染上下文
    CGContextStrokePath(ctx);

方式二

    //1 獲取上下文
   CGContextRef context = UIGraphicsGetCurrentContext();
    
    //2 創建一個繪制的路徑
    CGMutablePathRef path = CGPathCreateMutable();
    
    //畫線
    //(1)設置起始點
    CGPathMoveToPoint(path, NULL, 50, 50);
    
    //(2)設置目標點
    CGPathAddLineToPoint(path, NULL, 200, 200);
    
    CGPathAddLineToPoint(path, NULL, 50, 200);
    //關閉路徑和注釋這句實現了一樣的效果
    //    CGPathAddLineToPoint(path, NULL, 50, 50);
    
    //關閉路徑(將路徑封閉起來)
    CGPathCloseSubpath(path);
    
    //3 將路徑添加到上下文
    CGContextAddPath(context, path);
    
    
    //4 設置上下文的屬性
    //設置填充顏色
    CGContextSetRGBFillColor(context, 250/255.0, 200/255.0, 50/255.0, 1.0);
    
    //設置線條顏色
    CGContextSetRGBStrokeColor(context, 65/255.0, 170/255.0, 50/255.0, 1.0);
    //設置線條寬度
    CGContextSetLineWidth(context, 30);
    
    //設置線條轉折點的樣式
    CGContextSetLineJoin(context, kCGLineJoinRound);
    
    
    //5 渲染上下文
    /*渲染模式:
     kCGPathFill:填充(實心)
     kCGPathStroke:只畫線(空心)
     kCGPathFillStroke:即畫線又填充
     */
    //使用了設置屬性進行渲染
    CGContextDrawPath(context, kCGPathFillStroke);
    
    
    //6 釋放路徑
    CGPathRelease(path);

方式三

    // 獲取上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    
    // 描述路徑
    // 設置起點
    CGContextMoveToPoint(ctx, 50, 50);
    
    CGContextAddLineToPoint(ctx, 200, 200);
    
    // 渲染上下文
    CGContextStrokePath(ctx);

方式四

    //1 獲取上下文
    CGContextRef context = UIGraphicsGetCurrentContext();
    //2 添加多條線
    CGPoint p0 = {50,50};
    CGPoint p1 = {200,200};
    CGPoint p2= {50,200};
    CGPoint p3 = {50,50};
    CGPoint points[] = {p0,p1,p2,p3};
    
    CGContextAddLines(context, points, 4);
    
    
    //3 設置屬性
    //---UIKit提供的設置顏色的方法--------
    //設置線條顏色
    [[UIColor redColor] setStroke];
    //設置填充顏色
    [[UIColor blueColor]setFill];
    
    //4 繪制路徑
    CGContextDrawPath(context, kCGPathFillStroke);

方式五

    
    // 貝瑟爾路徑
    // 創建路徑
    UIBezierPath *path = [UIBezierPath bezierPath];
    
    // 設置起點
    [path moveToPoint:CGPointMake(50, 50)];
    
    // 添加一根線到某個點
    [path addLineToPoint:CGPointMake(200, 200)];
    
    // 繪制路徑
    [path stroke];

方式六

    //畫兩根線段
    //創建貝瑟爾路徑
    UIBezierPath *path = [UIBezierPath bezierPath];
    //起點
    [path moveToPoint:CGPointMake(50, 50)];
    //終點
    [path addLineToPoint:CGPointMake(200, 200)];
    
    //線寬
    path.lineWidth = 10;
    //設置線條顏色和背景填充顏色均為紅色
    [[UIColor redColor] set];
    
    [path stroke];
    
    UIBezierPath *path1 = [UIBezierPath bezierPath];
    
    [path1 moveToPoint:CGPointMake(0, 0)];
    
    [path1 addLineToPoint:CGPointMake(30, 60)];
    [[UIColor greenColor] set];
    
    path1.lineWidth = 3;
    
    [path1 stroke];

曲線的繪制

方式一

     //S型曲線
    //1 設置起始點
    CGContextMoveToPoint(context, 20, 200);
    
    //2 畫貝塞爾曲線
    //(1) 3個點
    /*
    CGContextAddCurveToPoint(<#CGContextRef  _Nullable c#>, cp1x, cp1y, cp2x, cp2y, x, y)
     <#CGContextRef  _Nullable c#>:上下文
     cp1x cp1y: 第一條切線的終點
     cp2x cp2y: 第二條切線的起點
     x  y: 第二條切線的終點
     */
  CGContextAddCurveToPoint(context, 100, 20, 200, 300, 300, 50);
    //3設置屬性
    [[UIColor redColor] setStroke];
  
    //4 渲染
   CGContextDrawPath(context, kCGPathStroke);

方式二

    //拋物線曲線
    // 獲取上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    
    // 描述路徑
    // 設置起點
    CGContextMoveToPoint(ctx, 50, 50);
    
    // cpx:控制點(這里是150,20)
    CGContextAddQuadCurveToPoint(ctx, 150, 20, 250, 50);
    
    [[UIColor whiteColor]setStroke];
    
    // 渲染上下文
    CGContextStrokePath(ctx);

矩形繪制

方式一


    //----------第一種:core Graphics-----------
    //1 獲取上下文
    CGContextRef context = UIGraphicsGetCurrentContext();
    //2 添加矩形
   CGRect rect = CGRectMake(40, 40, 100, 200);
    CGContextAddRect(context, rect);
    
    //3 設置屬性
    [[UIColor redColor]setStroke];
    [[UIColor orangeColor]setFill];
    
    //4 繪制
    CGContextDrawPath(context, kCGPathFillStroke);

方式二

    
    //----------第二種:UIKit- 提供繪制矩形的函數  (已經封裝好的)----------
    [[UIColor redColor]setStroke];
    [[UIColor orangeColor]setFill];
    
    CGRect rect = CGRectMake(40, 40, 100, 200);
    //繪制線條矩形(空心)
  //    UIRectFrame(rect);
    
    //繪制填充的矩形(實心)
    UIRectFill(rect);

方式三

    // 圓角矩形
   UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(20, 20, 200, 200) cornerRadius:8];
    //注意:如果矩形為正方形,cornerRadius的值為邊長的一半,就變成了圓形

    //設置線條的顏色
    [[UIColor whiteColor]setStroke];
    //設置填充顏色
    [[UIColor whiteColor]setFill];
    //渲染
    [path stroke];
    [path fill];
    

繪制圓弧、圓(橢圓)、扇形

    // 繪制圓弧
    /**
     *
     *
     *  @param context      上下文
     *  @param x#>          圓的中心點坐標x description#>
     *  @param y#>          圓的中心點坐標y description#>
     *  @param radius#>     圓的半徑 description#>
     *  @param startAngle#> 開始的角度 description#>
     *  @param endAngle#>   結束的角度 description#>
     *  @param clockwise#>  畫的方向 0 順時針  1 逆時針
     */
    CGContextAddArc(context, 160, 100, 100, 0, M_PI_4, 0);
    
    //設置屬性
    [[UIColor redColor]setStroke];

    //繪制
    CGContextDrawPath(context, kCGPathStroke);
    
    // 繪制扇形
    CGPoint center = CGPointMake(125, 125);
     UIBezierPath *path = [UIBezierPath 

    // Center:圓心
    // startAngle:弧度
    // clockwise:YES:順時針 NO:逆時針
    bezierPathWithArcCenter:center radius:100 startAngle:0 endAngle:M_PI_2 clockwise:YES];
    
    // 添加一根線到圓心
    [path addLineToPoint:center];
    
    // 封閉路徑,關閉路徑:從路徑的終點到起點
    [path closePath];
    //渲染
   [path stroke];
    

    
    
     //繪制內切圓(橢圓)

    CGRect rect = CGRectMake(50, 50, 200, 100);
    //注意:如果為正方形,則畫出的是圓形;為長方形,則為橢圓
    
    //設置屬性
    [[UIColor blackColor]setStroke];
    [[UIColor orangeColor]setFill];
    
    //繪制線條矩形
    //UIRectFrame(rect);
    
    //根據矩形繪制的橢圓(我這里畫的是橢圓)
    CGContextAddEllipseInRect(context, rect);
    
    //繪制
    CGContextDrawPath(context, kCGPathFillStroke);

提示:繪制弧、扇形的方法可以實現本節的所有圖形哦

繪制圖片

方式一

    UIImage *image = [UIImage imageNamed:@"1.jpg"];
    
    //一 UIKit提供的方法
    //1 指定一個點來繪制圖片 (錨點)
    [image drawAtPoint:CGPointMake(50, 50)];
    
    //2 指定一個矩形范圍來繪制 (拉伸填充)
  //    [image drawInRect:CGRectMake(0, 0, 300, 200)];
    
    //3 指定一個矩形范圍平鋪繪制
  //    [image drawAsPatternInRect:CGRectMake(0, 0, 300, 200)];

方式二

    
    
    //二 core graphics 提供的函數

    CGContextRef context = UIGraphicsGetCurrentContext();
    UIImage *image = [UIImage imageNamed:@"1.jpg"];
    //1 保存上下文狀態
    CGContextSaveGState(context);
    
    //2 切換坐標系
    Quartz 2D的坐標系(與數學的二維坐標系一樣)----->UIKit的坐標系
    //(1)向上平移一個高度
    CGContextTranslateCTM(context, 0, 200);
    //(2)改變y軸的方向 (縮放y的坐標,使其方向反轉)
    CGContextScaleCTM(context, 1, -1);
    
    
    //3 圖片繪制
    CGContextDrawImage(context, CGRectMake(0, 0, 300, 200), image.CGImage);
    
    //4 恢復到之前保存的上下文狀態
    CGContextRestoreGState(context);

繪制文字

    // 繪制文字
    
    NSString *str = @"asfdsfsdf";
    
    
    // 文字的起點
    // Attributes:文本屬性

    NSMutableDictionary *textDict = [NSMutableDictionary dictionary];

    // 設置文字顏色
    textDict[NSForegroundColorAttributeName] = [UIColor redColor];

    // 設置文字字體
    textDict[NSFontAttributeName] = [UIFont systemFontOfSize:30];

    // 設置文字的空心顏色和寬度

    textDict[NSStrokeWidthAttributeName] = @3;

    textDict[NSStrokeColorAttributeName] = [UIColor yellowColor];

    // 創建陰影對象
    NSShadow *shadow = [[NSShadow alloc] init];
    shadow.shadowColor = [UIColor greenColor];
    shadow.shadowOffset = CGSizeMake(4, 4);
    shadow.shadowBlurRadius = 3;
    textDict[NSShadowAttributeName] = shadow;

    // 富文本:給普通的文字添加顏色,字體大小
    [str drawAtPoint:CGPointZero withAttributes:textDict];
    }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,546評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,570評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,505評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,017評論 1 313
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,786評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,219評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,287評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,438評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,971評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,796評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,995評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,540評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,230評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,918評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,697評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內容

  • 路徑定義一個或多個形狀或子路徑。 子路徑可以由直線,曲線或兩者組成。 它可以打開或關閉。 子路徑可以是簡單的形狀,...
    權宜平和閱讀 838評論 0 1
  • 本文轉載自:http://southpeak.github.io/2014/11/16/quartz2d-3/ 路...
    idiot_lin閱讀 485評論 0 0
  • 18- UIBezierPath官方API中文翻譯(待校對) ----------------- 華麗的分割線 -...
    醉臥欄桿聽雨聲閱讀 1,081評論 1 1
  • Quartz2D以及drawRect的重繪機制字數1487 閱讀21 評論1 喜歡1一、什么是Quartz2D Q...
    PurpleWind閱讀 786評論 0 3
  • 其實今天應該去參加學校的演講會的,可惜有事不能參與,本以為會有許多家長參與,可聽去的家長說去的很少,于老師可能還被...
    王柯媽媽閱讀 164評論 0 0