你好,歡迎來到IOS教程網

 Ios教程網 >> IOS使用技巧 >> IOS技巧綜合 >> iOS繪圖

iOS繪圖

編輯:IOS技巧綜合
[摘要]本文是對iOS繪圖的講解,對學習IOS蘋果軟件開發有所幫助,與大家分享。

iOS繪圖

在iOS中常用有三套繪圖API。一個是UIKit提供的高層API,一個是CoreGraphics提供的C語言層的API,最後一個是OpenGL ES提供的API。

iOS的繪圖邏輯代碼需要放在UIView的drawRect:方法裡面實現,所以繪圖只能發生在UIView上面。

繪圖後如果我們想要顯示圖像可以調用

setNeedsDisplay和setNeedsDisplayInRect:。這兩個方法是用來標示一個視圖是否需要進行重繪,這裡標示重繪並不會馬上重新繪制,而是等到該RunLoop上面的任務執行完成後才回執行重繪。

觸發重繪有以下幾種情況:

1.當遮擋你的視圖得其它視圖被移動或者刪除操作得時候;

2.將視圖的hidden屬性聲明設置為No,使其從隱藏狀態變為可見;

3.將視圖滾出屏幕,然後重新回到屏幕;

4.顯示調用視圖的setNeedsDisplay或者setNeedsDisplayInRect:方法;

UIKit繪圖

比較簡單,這裡就說一些常用API。

設置畫筆顏色:

畫筆顏色分為描邊顏色和填充顏色,都是用UIColor的API設置的。在drawRect方法中調用

[[UIColor anyColor] setFill]設置填充顏色。
[[UIColor anyColor] setStroke]設置描邊顏色。

設置繪圖區域:

UIRectFill(CGRect rect),填充某一區域 。
UIRectFrame(CGRect rect),矩形描邊函數。
UIBezierPath,繪圖路徑類,包括了線段、弧線、矩形、圓形等等。

其中UIBezierPath可以定制主來很多很復雜的圖形,這裡就不具體的說UIBezierPath的api了,使用起來比較簡單直接看文檔就可以。

繪制圖像

UIImage提供了自己的繪圖方法。顯示UIImage,除了添加到UIImageView中,還可以直接畫到UIView上面,常用API如下:

-(void)drawAtPoint:(CGPoint)point;在某個點繪制
-(void)drawInRect:(CGRect)rect;繪制到某個矩形中
-(void)drawAsPatternInRect;繪制到某個矩形中並平鋪

繪制文字

NSString的category同樣提供了繪制文字的功能

-(void)drawAtPoint:(CGPoint)point withAttributes:(NSDictionary *)attrs,文本在制定點用屬性繪制。
-(void)drawInRect:(CGRect)rect withAttributes:(NSDictionary *)attrs,文本在指定的矩形裡繪制。

它們都可以用attrs,這和NSAttributedString很像。

CoreGraphics繪圖

繪圖上下文CGContextRef,CoreGraphics很類似java、C#等,需要有一個繪圖上下文。

上下文中保存了要繪制內容的信息,要獲得上下文需要調用。

CGContextRef UIGraphicsGetCurrentContext(void)。

常用API

移動點
void CGContextMoveToPoint(CGContextRef c, CGFloat x, CGFloat y)
畫線
void CGContextAddLineToPoint(CGContextRef c, CGFloat x, CGFloat y)
閉合路徑
void CGContextClosePath(CGContextRef c)
繪制路徑
void CGContextDrawPath(CGContextRef c, CGPathDrawingMode mode)
設置描邊顏色
void CGContextSetStrokeColorWithColor(CGContextRef c, CGColorRef color)
設置填充顏色
void CGContextSetFillColorWithColor(CGContextRef c, CGColorRef color)
繪制貝塞爾曲線,這裡的參數分別是兩個控制點和交點的左邊,大家可以自行百度貝塞爾曲線定義
void CGContextAddCurveToPoint(CGContextRef c, CGFloat cp1x,CGFloat cp1y, CGFloat cp2x, CGFloat cp2y, CGFloat x, CGFloat y)
保存上下文
void CGContextSaveGState(CGContextRef c)
讀取上下文
void CGContextRestoreGState(CGContextRef c)

常用API有很多這裡只列舉上面這些,剩下的可以查下API

CoreGraphics坐標系

CoreGraphics坐標系和我們平時用UIKit的坐標系是不樣的,CoreGraphics的左下角為(0,0)點,而UIKit的左上角為(0,0)點。

所以我們在開發的時候,一般會先同步坐標系(CoreText也需要這麼操作),應該這樣寫

CGContextTranslateCTM(context, 0, img.size.height);平移變化
CGContextScaleCTM(context,1,-1);縮放變換

先利用平移變換上移一個視圖大小,然後在用縮放變化把高度設-1進行以x為軸的對稱變換。

變換

接下來說說變換,繪圖是有很多矩陣變換的,其中常用的有以下:

1.平移變換

2.縮放變換

3.旋轉變換

4.x軸對稱變換

5.y軸對稱變換

6.坐標原點對稱變換

矩陣變換CTM

CoreGraphics中提供了很多矩陣變換的API,主要有

CGContextRoatateCMT,旋轉CTM,旋轉變換;
CGContextScaleCTM,縮放變換;
CGContextTranslateCTM,平移變換。

仿射變換affine

仿射變換是可以重用的變換,通過多次的矩陣乘法得到變換矩陣。

CGAffineMakeRotation,創建新的旋轉矩陣;
CGAffineMakeScale,創建新的縮放矩陣;
CGAffineMakeTranslation,創建新的平移矩陣;
CGAffineTransform,仿射矩陣,可以經過多次變換;
CGAffineTransformRotate,旋轉矩陣;
CGAffineTransformScale,縮放矩陣;
CGAffineTransformTranslate,平移矩陣;
CGContextConcatCTM,連接到CTM變換。

我們可以創建一個CGAffineTransform,然後經過多次的仿射變換後連接到CTM進行顯示。

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved