2011-06-11 68 views
5

我創建了由多個路徑段(實線,虛線,線條,顏色,弧線等)組成的複雜UIBezierPath。因此,我有這個現在我想要將其渲染爲CGContext。iPhone - 將UIBezierPath複製到CGPath並渲染爲原始

所以,我將其轉換爲使用

CGPathRef cgPath = CGPathCreateCopy(aBezierPath.CGPath); 

的問題CGPathReference是這樣的:從理論上說,如果我要畫上一個CGContext上的路徑,我必須定義筆畫的寬度,顏色,行樣式,混合模式等等,但是我已經創建的UIBezierPath包含了所有這些信息。

因此,我想知道是否有一種方法可以將CGPath「加蓋」在CGContext上,因此它會加蓋所有原始信息?

謝謝。

+1

你不能只使用UIBezierPath的筆畫方法嗎? – 2011-06-11 11:45:48

回答

6

DR,你是對的:這很混亂!

但我認爲湯姆是正確的,只需使用[aBezierPath stroke]。

所以,這將是這樣的:

REF是(CGContextRef),你已經建立。

YOURBEZIERPATH是(UIBezierPath *)。

不可避免的,你必須處理與「引倒掛」的問題,所以:

UIGraphicsPushContext(REF); 
CGContextSaveGState(REF); 
CGContextTranslateCTM(REF, 0, the height*); 
CGContextScaleCTM(REF, 1.0, -1.0); 
[YOURBEZIERPATH stroke]; 
CGContextRestoreGState(REF); 
UIGraphicsPopContext(); 

所以這是它。

Re 您的評論下面我有一個UIBezierPaths數組。每個貝塞爾都有自己的風格和顏色。

這是否對您有幫助? ...更換一個「中風」號召,用一個for循環:

UIGraphicsPushContext(REF); 
CGContextSaveGState(REF); 
CGContextTranslateCTM(REF, 0, the height*); 
CGContextScaleCTM(REF, 1.0, -1.0); 

for each of YOURBEZIERPATH in your array... 
    { 
    CGContextSaveGState(REF); 
    [YOURBEZIERPATH stroke]; 
    CGContextRestoreGState(REF); 
    } 

CGContextRestoreGState(REF); 
UIGraphicsPopContext(); 

你其實並不需要使用aBezierPath.CGPath,或者,它們的副本打擾。

你是對的,它是非常混亂,UI和CG的兩個世界!


* 身高:經常像self.frame.size.height。我只是將它包括在任何尋找未來通用示例代碼的人中。

+0

謝謝,這幾乎適用於我。我唯一的問題是:我有一系列UIBezierPaths,我必須繪製到上下文。每個貝塞爾都有自己的風格和顏色。當我使用自己的方法在循環中描述路徑時,每次調用方法時,所有路徑(包括先前被撫摸的路徑)都會更改爲最後指定的樣式。例如:我有3條路徑:虛線/藍色,固體/紅色,固體/綠色。第一次運行後,我有一個虛線/藍色路徑。第二次運行後,我有兩個固體/紅色路徑,第三次運行後,所有路徑都變爲固體/綠色。 – SpaceDog 2011-06-11 17:33:43

+0

謝謝喬,我誤解了一些概念,但現在它像魔術一樣工作。謝謝!!! – SpaceDog 2011-06-12 21:27:21

+0

不,我做了相反的事情,每次我需要更新某些東西時,我會繪製所有路徑。繪製所有路徑並不像我想象的那麼慢,那麼它運行得非常好。 – SpaceDog 2011-06-13 19:22:45