2012-05-19 61 views
11

在iOS上,我們可以使用在iOS上,爲什麼UIBezierPath繪圖不需要上下文?

CGContextRef context = UIGraphicsGetCurrentContext(); 
CGContextBeginPath (context); 
CGContextMoveToPoint(context, 0, 0); 
CGContextAddLineToPoint(context, 100, 100); 
CGContextStrokePath(context); 

drawRect劃一條線,但我們也可以繪製一個矩形,如果我們去掉上面的代碼,而只是使用:

UIBezierPath *path = [UIBezierPath bezierPathWithRect:CGRectMake(0, 0, 100, 100)]; 
[path stroke]; 

兩個相關的問題:

1)爲什麼UIBezierPath需要獲取或使用當前上下文?

2)如果我有兩個方面:一個是屏幕,一個是位圖背景下,再怎麼告訴提請對UIBezierPath哪些方面?我認爲它可能是UIGraphicsSetCurrentContext但它不存在。

回答

22

UIBezierPath確實使用上下文。它使用當前的UIKit圖形上下文。這與你已經用UIGraphicsGetCurrentContext()得到的完全一樣。

如果你想要UIBezierPath使用不同的上下文,你可以使用UIGraphicsPushContext(),但是你必須記住當你完成後使用UIGraphicsPopContext()

+1

因此,我們將使用'UIGraphicsPushContext(myBitmapContext);'開始在位圖上下文中繪圖? –

+2

@動靜能量:這是正確的 –

5

在iOS上,我們可以使用

我已經強調了這句話的重要組成部分drawRect劃清界限。在drawRect:的內部,UIKit已經爲您設置了一個上下文,並且任何基於對象的繪圖指令都直接進入該上下文。 UIBezierPath確實正在使用該上下文,它只是不需要顯式傳遞。

在Cocoa Touch中,必須始終存在一個繪圖上下文(在這種情況下,上下文將最終繪製到屏幕上)。如果你不在drawRect:裏面,你必須自己創建一個上下文。

CGContextRef context = UIGraphicsGetCurrentContext(); 
CGContextBeginPath (context); 
CGContextMoveToPoint(context, 0, 0); 

注意,第一個函數調用是獲取CurrentContext()。當你使用CoreGraphics的功能性繪圖接口時,你需要傳遞一個上下文到每個函數中,但是你並沒有在這裏創建一個上下文,而只是檢索已經存在的上下文。

Graphics contexts堆疊。如果你想繪製一個你創建的上下文,你可以使用UIGraphicsPushContext()(如Kevin已經提到的)將它推入堆棧,然後回到前一個。

6

我認爲提及CGContextFillRect比使用UIBezierPath快8.5倍可能是有用的(在性能是一個因素的情況下,並假設您不需要使用UIBezierPath進行更復雜的繪製)。

我在Apple的HazardMap示例(http://developer.apple.com/library/ios/#samplecode/HazardMap/Introduction/Intro.html)中添加了一些時間,並且每毫秒每ms的時間爲〜0.00064 ms/rect for CGContextFillRect方法,對於UIBezierPath方法〜0.00543 ms/rect,推測b/c後者需要更多的消息傳遞開銷。

即zoomScale:inContext的我使用

CGContextFillRect(ctx, boundaryCGRect); 

與在HazardMapView內環使用

UIBezierPath* path = [UIBezierPath bezierPathWithRect:boundaryCGRect]; 
[path fill]; 

(加上上述的變更PUSH/POP傳遞給HazardMapView drawMapRect上下文比較:)。

ETA

+1

請注意,上述數字來自Macbook Pro(2012年初)上運行的iPhone 6.0模擬器。在實際的iPad3上運行此CGContextFillRect似乎比使用UIBezier路徑快5.7倍。 YMMV當然取決於您使用的是什麼設備(優化設置似乎不會對此產生太大影響)。 – ETA

相關問題