iOS繪圖java
在iOS中經常使用有三套繪圖API。一個是UIKit提供的高層API,一個是CoreGraphics提供的C語言層的API,最後一個是OpenGL ES提供的API。ios
iOS的繪圖邏輯代碼須要放在UIView的drawRect:方法裏面實現,因此繪圖只能發生在UIView上面。api
繪圖後若是咱們想要顯示圖像能夠調用安全
setNeedsDisplay和setNeedsDisplayInRect:。這兩個方法是用來標示一個視圖是否須要進行重繪,這裏標示重繪並不會立刻從新繪製,而是等到該RunLoop上面的任務執行完成後纔回執行重繪。函數
觸發重繪有如下幾種狀況:oop
1.當遮擋你的視圖得其它視圖被移動或者刪除操做得時候;spa
2.將視圖的hidden屬性聲明設置爲No,使其從隱藏狀態變爲可見;線程
3.將視圖滾出屏幕,而後從新回到屏幕;code
4.顯示調用視圖的setNeedsDisplay或者setNeedsDisplayInRect:方法;orm
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進行顯示。