麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

iOS繪圖

2019-11-14 18:31:48
字體:
來源:轉載
供稿:網友

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繪圖周期分析

通過下面這個例子來分析
PRogressView.hidden = NO;
[self doSomethingTimeConsuming];
progressView.hidden = YES;
第一行代碼progress.hidden = NO;根本沒有效果,這行代碼不會使進度視圖在執行耗時操作時顯示出來。無論這個方法運行多久,都不會看到視圖顯示出來。
 
所有的繪制都發生在主線程,只要代碼運行在主線程,就沒有東西可以繪制。這就是不要在主線程中執行長時間運行操作的一個原因。這不僅會阻礙繪制更新,還會阻礙事件處理(比如響應觸摸事件)。只要代碼在主線程上,應用對于用戶其實就是“功能掛起的”。如果主線程例程返回足夠快,這些變化根本就察覺不到。
你可能會想:“那我就在后臺線程運行我的繪圖指令。”通常是無法做到這一點的,因為對于當前的UIKit上下文來說繪圖不是線程安全的。任何在后臺線程修改視圖的嘗試都會導致未定義的行為,包括繪制出錯或崩潰。
這個行為并不是需要解決的問題。繪圖時間實質是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進行顯示。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 一边吃奶一边插下面 | av免费大全| 久草在线观看福利视频 | 成年人免费视频大全 | 三级xxxx| 91久久夜色精品国产网站 | 成人三级免费电影 | 久久中文一区 | 欧美国产免费 | 激情久久一区二区 | 久久久久夜色精品国产老牛91 | 91成人久久 | 嫩草91在线 | 石原莉奈日韩一区二区三区 | av久草| 久久久www免费看片 亚洲综合视频一区 | 国产一区二区成人在线 | 欧美日韩一区,二区,三区,久久精品 | 成人短视频在线观看免费 | 国产成人精品午夜视频' | 国产流白浆高潮在线观看 | 国产亚洲欧美一区久久久在 | 成人午夜在线免费视频 | 久久久免费电影 | 国产91久久精品 | 99国内精品视频 | 91麻豆精品国产91久久久无需广告 | 高潮激情aaaaa免费看 | 视频www| av在线一区二区三区四区 | 欧美一级免费在线观看 | 久草亚洲视频 | 欧美精品国产综合久久 | chinese hd xxxx tube| av日韩一区二区三区 | 红桃一区| 国产精品亚洲精品日韩已方 | 羞羞视频免费网站男男 | 成人福利在线 | 国产男女爽爽爽爽爽免费视频 | 中国美女一级黄色大片 |