9、iOS開發之 Quartz-2d

/**
 摘要:
 1.掌握Quartz2d的圖形繪製API
 2.掌握圖形上下文與輸出目標
 */

一、畫線drawLine

1.獲取上下文件UIGraphicsGetCurrentContext();
2.設置起點CGContextMoveToPoint(ctx, 10, 10);
3.添加連接點AddLineToPoint(ctx, 110, 10);
4.渲染CGContextStrokePath(ctx);
5.設置線寬CGContextSetLineWidth(ctx, 3);
6.設置線的顏色CGContextSetRGBStrokeColor(ctx, 1, 0, 0, 1);//紅色
7.再添加1個連接點完成矩形繪製
8.設置線的首尾樣式CGContextSetLineCap(ctx, kCGLineCapButt);
9.設置線的連接樣式CGContextSetLineJoin(ctx, kCGLineJoinRound);

二、畫矩形drawRectangle

// 1.獲取上下文件UIGraphicsGetCurrentContext();
// 2.設置起點,並連接四個點成爲矩形
CGContextMoveToPoint(ctx, 10, 10)
AddLineToPoint(ctx, 110, 10);
AddLineToPoint(ctx, 110, 110);
AddLineToPoint(ctx, 110, 10);
AddLineToPoint(ctx, 10, 10);
// 3.畫空心CGContextStrokePath(ctx)
// 4.畫實心CGContextFillPath(ctx);
// 5.使用CGContextStrokeRect();/ CGContextFillRect(); 畫矩形

三、畫三角形triangle

// 1.獲取上下文件UIGraphicsGetCurrentContext();
// 2.設置起點,並連接三個點
// 3.關閉路徑CGContextClosePath(ctx);
// 4.渲染CGContextStrokePath(ctx)

四、畫圓circle

CGContextAddEllipseInRect(context, CGRectMake(10, 10, 100, 100));

五、畫弧arc

//x y 圓點
//radius 半徑
//startAngle 開始角度
//endAngle 結束角度
//clockwise 圓弧的伸展方向 0 順時針 1 逆時針
CGContextAddArc(context, 100, 100, 50, 0, M_PI_2, 1);
//1順時針 0

六、畫扇形sector

//設置扇形路徑的起點
CGContextMoveToPoint(context, 100, 100);
CGContextAddArc(context, 100, 100, 50, M_PI_4, 3 * M_PI_4, 0);
CGContextClosePath(context);

七、畫文字和圖片

// 調用文字的drawAtPoint:或drawInRect方法文字可設置屬性
@{NSFontAttributeName:[UIFont systemFontOfSize:15],NSForegroundColorAttributeName:[UIColor redColor]};

圖片

// 可view上畫圖片調用drawAtPoint:或drawInRect方法
// drawAsPatternInRect可以平鋪圖片

八、畫進度圈

/**
 目標:
 自定View的drawRect方法會在view顯示的時候調用一次
 如果有重繪,需要調用view的setNeedsDisplay方法,就會調用drawRect方法,進行重繪
 */

[畫弧進度]

1.自定義一個ProgressCirle的view
2.在storyboard的箭頭所指的控制器添加一個View,並將classes指向ProgressCirle
3.在自定義view裏添加一個float 類型的progress屬性
4.在ProgressCirle的drawRect方法中畫文字和進度文字

(1)根據progress格式化要顯示的文本//eg.30%
(2)先使用NSString的【boundingRectWithSize:options:attributes:context:】計算文字的尺寸
(3)再計算文字顯示的x\y值
(4)調用NSString的drawInRect 畫文字

//畫弧

(5)計算要畫弧的位置 2π *progress
(6)調用CGContextAddArc(ctx, x, y,radius, startAngle, endAngle,clockwise)畫弧
起始位置爲0
(7)然後再設置起始位置爲-45度,重新計算結束位置

5.在控制器的view中,設置ProgressCirle的進度爲0.5

6.添加一個UISlider到控制器view,並設置UISlider的最大值爲1

7.監聽UISlider的事件,並改變ProgressCirle的progress屬性

8.重寫ProgressCirle的setProgress方法,並調用[self setNeedsDisplay]實現重繪

九、餅狀圖

/**目標
 *掌握餅狀圖的繪製原理
 */

步驟:

1.自定義一個餅狀View(PieView),添加到控制器View上
2.添加PieView的一個類型爲數據的sections屬性,存儲所有分類的個數,並添加一個顏色數組,用於存儲顏色
3.在drawRect方法中遍歷sections的大小
4.遍歷sections中的個數,進行總數繪總
5.定義一個 "扇形的起始位置"
6.設置路徑中心點
7.遍歷sections,計算數組中每一個元素佔用總數的比例
8.根據比例計算餅狀的結束位置,並設置 "弧" 路徑
9.渲染扇形在UIView上,實現實心的扇形
8."扇形的起始位置" 重新賦值,進入下一個循環

十、圖形上下文棧
“什麼是圖形上下文棧?”

(1)將當前的圖形上下文狀態copy一份到棧,這就是 '圖形上下文棧'
(2)上下文的什麼狀態呢?比如 顏色、線寬,這些都是上下文的狀態

“圖形上下文棧有什麼用?”

(1)恢復最初的繪圖狀態

“圖形上下文棧API”

1.保存圖形上下文狀態使用CGContextSaveGState方法
2.恢復圖形上下文狀態使用CGContextRestoreGState方法
3.CGContextRestoreGState不能調用多次,要看圖形上下文棧有多少個上下文狀態可恢復

十、矩陣操作

/*目標
 *掌握在圖層上下文中的平穩、縮放、旋轉
 */
//平移
CGContextTranslateCTM(ctx, 0, -80);
//縮放 - xy方向縮放到原來的幾倍
CGContextScaleCTM(ctx, 1.0, 1.0);
//旋轉 沿左上角旋轉
CGContextRotateCTM(ctx,-M_PI * 0.1);

十一、裁剪圓形圖片

/*掌握CGContextClip方法的作用,這個方法是裁剪 "路徑" 之外多餘的部分*/

“裁剪圓形圖片”步驟

1.自定義一個CircleImageView控件,在drawRect中,獲取上下文,往上下文中添加一個圓的路徑
2.調用CGContextClip的方法,裁剪路徑之外多餘的部分
3.自定義的控制中,添加一個imageName屬性,然後回到drawrect方法畫圖
4.畫圓的邊框,使用CGContextAddEllipseInRect添加圓的路徑,並使用CGContextStrokePath畫空心圓

十二、動畫(氣球)

/**
 *1.掌握定時器NSTimer和CADisplayLink的使用
 *2.CADisplayLink多用於UI的刷新,1/60秒調用一次
 *3.CADisplayLink要添加到主運行循環才能使用
 */
"一個氣球下降"步驟
1.自定義一個BalloonView,添加一個position屬性,用於記錄氣球的位置
2.在drawRect方法中,創建一張圖片,並畫出來
3.在awakeFromNib中,使用定時器NSTimer實現氣球下降功能效果
[NSTimer scheduledTimerWithTimeInterval:0.03 target:self selector:@selector(setNeedsDisplay) userInfo:nil repeats:YES]

4.在drawRect如果氣球的位置到達底部,從頂部重新開始下降
5.在awakeFromNib中,使用定時器CADisplayLink實現氣球下降功能效果
(1)創建CADisplayLink對象,調用addToRunLoop,定時器就會執行
(2)CADisplayLine有個duration屬性,代理定時器調用的間隔時間,不能改
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章