Quartz2D簡單使用

1,畫圖中的兩個方法的區別:c#

drawAtPoint:該方法以圖片的實際大小來顯示oop

drawInRect:該方法會將圖片拉伸填充指定的整個rectspa

drawAsPatternInRect:該方法會將圖片以實際大小平鋪到指定的rect中圖片

 

2,drawRect:方法調用的時間是當View調用viewWillAppear的時候系統調用,在該方法中,調用的時候能夠在該方法中拿到layer的圖層上下文。、內存

注意:drawRect方法是系統調用的,view不能調用,view能夠經過調用setNeedDisplay來間接調用drawRect方法。get

: 程序啓動,顯示自定義的view。當程序第一次顯示在咱們眼前的時候,程序會調用drawRect:方法,在裏面獲取了圖形上下文(在內存中擁有了),而後利用圖形上下文保存繪圖信息,能夠理解爲圖形上下文中有一塊區域用來保存繪圖信息,有一塊區域用來保存繪圖的狀態(線寬,圓角,顏色)。直線不是直接繪製到view上的,能夠理解爲在圖形上下文中有一塊單獨的區域用來先繪製圖形,當調用渲染方法的時候,再把繪製好的圖形顯示到view上去。it

 
在繪製圖形區域,會去保存繪圖狀態區域中查找對應的狀態信息(線寬,圓角,顏色),而後在繪圖區域把對第一條直線繪製完成。其實在渲染以前,就已經把直線在繪製圖形區域畫好了。
如圖:
     
說明:這些示意圖和本文中的程序代碼塊,不具有一一對應關係,只是爲了說明繪圖的完整過程。
調用渲染方法的時候,把繪製圖形區域已經畫好的圖形直接顯示到view上,就是咱們看到的樣子了。
如圖:
   
 

3,圖形上下文棧渲染

在獲取圖形上下文以後,經過 

CGContextSaveGState(ctx);date

 方法,把當前獲取的上下文拷貝一份,保存一份最純潔的圖形上下文。
在畫第二條線以前,使用CGContextRestoreGState(ctx);方法,還原開始的時候保存的那份最純潔的圖形上下文。
.圖形上下文棧機制
畫第一條線的時候,會把當前的圖形上下文拷貝一份保存到圖形上下文棧中。
畫第二條線的時候,去圖形上下文棧中取出棧頂的繪圖信息,做爲第二條線的狀態信息,第二條線的狀態信息也是據此(最初保存的那份圖形上下文)進行繪製。
            
注意:在棧裏保存了幾回,那麼就能夠取幾回(好比不能保存了1次,取兩次,在取第二次的時候,棧裏爲空會直接掛掉)。
 
4,矩陣三個方法
平移
方法: CGContextTranslateCTM(<#CGContextRef c#>, <#CGFloat tx#>, <#CGFloat ty#>)
縮放
方法:CGContextScaleCTM(<#CGContextRef c#>, <#CGFloat sx#>, <#CGFloat sy#>)
旋轉
 方法: CGContextRotateCTM(ctx, M_PI_4);
 

5 補充說明select

1.drawRect:

(1)爲何要實現drawRect:⽅法才能繪圖到view上?

由於在drawRect:⽅法中才能取得跟view相關聯的圖形上下文

(2)drawRect:⽅法在何時被調用?

當view第一次顯示到屏幕上時(被加到UIWindow上顯示出來)

調用view的setNeedsDisplay或者setNeedsDisplayInRect:時 

 
6,  兩個定時器

第一個:

[NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateImage) userInfo:nil repeats:YES];

說明: NSTimer通常用於定時的更新一些非界面上的數據,告訴多久調用一次

第二個:

        CADisplayLink *display= [CADisplayLink displayLinkWithTarget:self selector:@selector(updateImage)];

        [display addToRunLoop:[NSRunLoopmainRunLoop] forMode:NSDefaultRunLoopMode];

  說明: CADisplayLink刷幀,默認每秒刷新60次。該定時器建立以後,默認是不會執行的,須要把它加載到消息循環中

 
 
7,圖形上下文
圖形上下文(Graphics Context):是一個CGContextRef類型的數據

圖形上下文的做用:

(1)保存繪圖信息、繪圖狀態
(2)決定繪製的輸出目標(繪製到什麼地⽅去?) (輸出目標能夠是PDF⽂文件、Bitmap或者顯示器的窗口上)

相同的⼀套繪圖序列,指定不一樣的Graphics Context,就可將相同的圖像繪製到不一樣的目標上 

相關文章
相關標籤/搜索