国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

iOS繪圖

2019-11-14 18:31:48
字體:
供稿:網(wǎng)友

iOS繪圖

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

iOS的繪圖邏輯代碼需要放在UIView的drawRect:方法里面實(shí)現(xiàn),所以繪圖只能發(fā)生在UIView上面。

繪圖后如果我們想要顯示圖像可以調(diào)用

setNeedsDisplay和setNeedsDisplayInRect:。這兩個(gè)方法是用來標(biāo)示一個(gè)視圖是否需要進(jìn)行重繪,這里標(biāo)示重繪并不會(huì)馬上重新繪制,而是等到該RunLoop上面的任務(wù)執(zhí)行完成后才回執(zhí)行重繪。

觸發(fā)重繪有以下幾種情況:

1.當(dāng)遮擋你的視圖得其它視圖被移動(dòng)或者刪除操作得時(shí)候;

2.將視圖的hidden屬性聲明設(shè)置為No,使其從隱藏狀態(tài)變?yōu)榭梢姡?/p>

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

4.顯示調(diào)用視圖的setNeedsDisplay或者setNeedsDisplayInRect:方法;

 

ios繪圖周期分析

通過下面這個(gè)例子來分析
PRogressView.hidden = NO;
[self doSomethingTimeConsuming];
progressView.hidden = YES;
第一行代碼progress.hidden = NO;根本沒有效果,這行代碼不會(huì)使進(jìn)度視圖在執(zhí)行耗時(shí)操作時(shí)顯示出來。無論這個(gè)方法運(yùn)行多久,都不會(huì)看到視圖顯示出來。
 
所有的繪制都發(fā)生在主線程,只要代碼運(yùn)行在主線程,就沒有東西可以繪制。這就是不要在主線程中執(zhí)行長(zhǎng)時(shí)間運(yùn)行操作的一個(gè)原因。這不僅會(huì)阻礙繪制更新,還會(huì)阻礙事件處理(比如響應(yīng)觸摸事件)。只要代碼在主線程上,應(yīng)用對(duì)于用戶其實(shí)就是“功能掛起的”。如果主線程例程返回足夠快,這些變化根本就察覺不到。
你可能會(huì)想:“那我就在后臺(tái)線程運(yùn)行我的繪圖指令。”通常是無法做到這一點(diǎn)的,因?yàn)閷?duì)于當(dāng)前的UIKit上下文來說繪圖不是線程安全的。任何在后臺(tái)線程修改視圖的嘗試都會(huì)導(dǎo)致未定義的行為,包括繪制出錯(cuò)或崩潰。
這個(gè)行為并不是需要解決的問題。繪圖時(shí)間實(shí)質(zhì)是ios在有限的硬件上渲染復(fù)雜繪圖的功能。

 

UIKit繪圖

比較簡(jiǎn)單,這里就說一些常用API。

設(shè)置畫筆顏色:

畫筆顏色分為描邊顏色和填充顏色,都是用UIColor的API設(shè)置的。在drawRect方法中調(diào)用

[[UIColor anyColor] setFill]設(shè)置填充顏色。[[UIColor anyColor] setStroke]設(shè)置描邊顏色。

設(shè)置繪圖區(qū)域:

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

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

繪制圖像

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

-(void)drawAtPoint:(CGPoint)point;在某個(gè)點(diǎn)繪制-(void)drawInRect:(CGRect)rect;繪制到某個(gè)矩形中-(void)drawaspatternInRect;繪制到某個(gè)矩形中并平鋪

繪制文字

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

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

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

 

CoreGraphics繪圖

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

上下文中保存了要繪制內(nèi)容的信息,要獲得上下文需要調(diào)用。

CGContextRef UIGraphicsGetCurrentContext(void)。

常用API

移動(dòng)點(diǎn)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)設(shè)置描邊顏色void CGContextSetStrokeColorWithColor(CGContextRef c, CGColorRef color)設(shè)置填充顏色void CGContextSetFillColorWithColor(CGContextRef c, CGColorRef color)繪制貝塞爾曲線,這里的參數(shù)分別是兩個(gè)控制點(diǎn)和交點(diǎn)的左邊,大家可以自行百度貝塞爾曲線定義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坐標(biāo)系

CoreGraphics坐標(biāo)系和我們平時(shí)用UIKit的坐標(biāo)系是不樣的,CoreGraphics的左下角為(0,0)點(diǎn),而UIKit的左上角為(0,0)點(diǎn)。

所以我們?cè)陂_發(fā)的時(shí)候,一般會(huì)先同步坐標(biāo)系(CoreText也需要這么操作),應(yīng)該這樣寫

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

先利用平移變換上移一個(gè)視圖大小,然后在用縮放變化把高度設(shè)-1進(jìn)行以x為軸的對(duì)稱變換。

 

變換

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

1.平移變換

2.縮放變換

3.旋轉(zhuǎn)變換

4.x軸對(duì)稱變換

5.y軸對(duì)稱變換

6.坐標(biāo)原點(diǎn)對(duì)稱變換

矩陣變換CTM

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

CGContextRoatateCMT,旋轉(zhuǎn)CTM,旋轉(zhuǎn)變換;CGContextScaleCTM,縮放變換;CGContextTranslateCTM,平移變換。

仿射變換affine

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

CGAffineMakeRotation,創(chuàng)建新的旋轉(zhuǎn)矩陣;CGAffineMakeScale,創(chuàng)建新的縮放矩陣;CGAffineMakeTranslation,創(chuàng)建新的平移矩陣;CGAffineTransform,仿射矩陣,可以經(jīng)過多次變換;CGAffineTransformRotate,旋轉(zhuǎn)矩陣;CGAffineTransformScale,縮放矩陣;CGAffineTransformTranslate,平移矩陣;CGContextConcatCTM,連接到CTM變換。

我們可以創(chuàng)建一個(gè)CGAffineTransform,然后經(jīng)過多次的仿射變換后連接到CTM進(jìn)行顯示。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 铁力市| 贵州省| 开平市| 京山县| 钦州市| 钟祥市| 久治县| 丘北县| 灌云县| 高淳县| 清涧县| 朝阳区| 大埔区| 嘉兴市| 东港市| 从化市| 镇康县| 崇左市| 张掖市| 沿河| 英超| 黄大仙区| 和硕县| 苏州市| 乌拉特前旗| 报价| 运城市| 抚顺县| 桑日县| 民县| 烟台市| 义乌市| 新田县| 伊春市| 红桥区| 台北市| 山丹县| 雷州市| 保德县| 新丰县| 长子县|