亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

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网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩免费观看在线观看| 亚洲女人被黑人巨大进入al| 91九色国产在线| 亚洲综合av影视| 亚洲精品videossex少妇| 亚洲最大中文字幕| 欧美日韩激情网| 青草青草久热精品视频在线观看| 精品国模在线视频| 亚洲精品国产精品久久清纯直播| 日韩va亚洲va欧洲va国产| 日韩成人中文电影| 97精品国产97久久久久久春色| 欧美在线一级视频| 欧美最顶级丰满的aⅴ艳星| 亚洲美女av网站| 国产精品老女人精品视频| 亚洲一级黄色av| 国产欧美日韩亚洲精品| 欧美精品videossex性护士| 亚洲精品中文字| 国产一区二区三区四区福利| 国产精品a久久久久久| 国产视频亚洲精品| 国产一区二区三区网站| 欧美最猛性xxxxx(亚洲精品)| 亚洲iv一区二区三区| 亚洲色图综合网| 亚洲成人av在线播放| 国产精品久久久久久久久久三级| 亚洲一区中文字幕在线观看| www.亚洲男人天堂| 亚洲人成啪啪网站| 97人人爽人人喊人人模波多| 日日狠狠久久偷偷四色综合免费| 国产一区二区在线免费视频| 日韩av在线免费观看一区| 亚洲精品一区中文字幕乱码| 国产精品久久二区| 国产精品久久久久久久久免费| 日韩中文字幕精品视频| 色偷偷综合社区| 欧美精品激情blacked18| 在线精品国产成人综合| 欧美日韩国产区| 欧美老妇交乱视频| 日韩一二三在线视频播| 精品久久久久久久大神国产| 成人做爰www免费看视频网站| 美日韩精品视频免费看| 欧美午夜片欧美片在线观看| 欧美性猛交丰臀xxxxx网站| 欧美交受高潮1| 国产成人激情视频| 国产在线拍偷自揄拍精品| 亚洲电影免费观看高清| 成人亚洲综合色就1024| 视频在线观看99| 日韩免费看的电影电视剧大全| 国产精品 欧美在线| 97精品国产91久久久久久| 九九热这里只有精品免费看| 国产精品久久91| 欧美激情第三页| 亚洲成人精品av| 成人精品网站在线观看| 欧美中文字幕第一页| 国产美女主播一区| 亚洲综合视频1区| 日韩av网址在线观看| 国内免费久久久久久久久久久| 日韩大陆欧美高清视频区| 日韩电影免费在线观看| 久久精品亚洲94久久精品| 欧美成人免费播放| 久久久久久久久久国产| 国产97在线|日韩| 国产精品嫩草影院一区二区| 国产精品一区=区| 国产这里只有精品| 欧美又大粗又爽又黄大片视频| 91免费看片在线| 日本精品免费一区二区三区| 国产91成人video| 亚洲人成电影在线播放| 欧美日韩在线免费| 高清一区二区三区四区五区| 亚洲激情电影中文字幕| 日韩成人黄色av| 一区二区欧美在线| 久久成年人免费电影| 国产一区二区三区毛片| www.日韩.com| 亚洲成人激情视频| 亚洲精品99999| 欧美国产精品人人做人人爱| 国产日韩精品在线播放| 欧美日韩免费看| 国产午夜精品理论片a级探花| 4k岛国日韩精品**专区| 亚洲欧美在线x视频| 亚洲精品一区二区三区婷婷月| 日韩在线观看免费高清| 中文字幕欧美精品日韩中文字幕| 欧美性猛交xxxx偷拍洗澡| 成人免费观看网址| 日韩在线播放视频| 日本精品一区二区三区在线| 精品动漫一区二区三区| 国产精品毛片a∨一区二区三区|国| 91网站在线免费观看| 久久久久久久电影一区| 亚洲精品中文字幕有码专区| 国产精品视频999| 欧美大人香蕉在线| 91久久国产精品| 午夜精品久久久久久久男人的天堂| 亚洲国产97在线精品一区| 欧美福利视频在线| 在线观看日韩欧美| 亚洲影院色在线观看免费| 亚洲乱亚洲乱妇无码| 久久久精品一区| 欧美壮男野外gaytube| www.久久草.com| 精品一区二区三区三区| 国产91精品最新在线播放| 欧美高清性猛交| 91精品久久久久久久久| 日韩欧美国产网站| 欧洲中文字幕国产精品| 亚洲黄页网在线观看| 亚洲国产私拍精品国模在线观看| 久久91精品国产91久久久| 国产视频精品在线| 成人www视频在线观看| 亚洲天堂男人天堂女人天堂| 欧美激情视频在线免费观看 欧美视频免费一| 久久久女人电视剧免费播放下载| 国产精品亚洲综合天堂夜夜| 国产精品老女人视频| 久久精品亚洲一区| 孩xxxx性bbbb欧美| 欧美精品videosex性欧美| 精品国内亚洲在观看18黄| 4438全国亚洲精品在线观看视频| 亚洲iv一区二区三区| 国产精品久久久久久久一区探花| 高清欧美性猛交xxxx黑人猛交| 中文字幕精品在线视频| 欧美成人精品不卡视频在线观看| 亚洲成人精品视频在线观看| 精品久久中文字幕久久av| 欧美高清视频在线播放| 91亚洲精品一区| 亚洲精品国偷自产在线99热| 色噜噜久久综合伊人一本| 精品香蕉在线观看视频一| 国产精品福利在线观看网址| 久久中文精品视频| 亚洲天天在线日亚洲洲精| 欧美激情网站在线观看| 777国产偷窥盗摄精品视频| 欧洲s码亚洲m码精品一区|