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:方法;
ios繪圖周期分析
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進行顯示。
|
新聞熱點
疑難解答