2014-03-24 35 views
0

我需要在CGContext中繪製一系列路徑作爲塊。這些路徑是由用戶繪製的,所以我無法確定他們的方向。我用下面的代碼段,以繪製的路徑:CGContextRef和偶奇填充規則

CGContextSaveGState(context); 
UIBezierPath *fillPath = [ UIBezierPath bezierPath ]; 

for (UIBezierPath *path in arrayOfPaths) { 
    [ fillPath appendPath:path ]; 
} 

CGContextAddPath(context, fillPath.CGPath); 
CGContextSetFillColorWithColor(context, [[UIColor GreenColor ] colorWithAlphaComponent:0.3 ].CGColor); 
CGContextFillPath(context); 

然而,如果路徑是在相反方向創建的結果繪圖似乎產生的圖,其中所述重疊部分被敲除,相當於設置偶數 - 奇數的規則爲是。

有什麼建議嗎?

回答

0

您可以用CGContextSaveGState/CGContextRestoreGState指令來包圍填充每條路徑的線條。這樣你就可以從頭開始,即。用乾淨的路徑堆疊在每個填充物上。

編輯:我有一個很好的包裝功能部件此:

void CGContextBlock(CGContextRef ctx, void (^block)()) 
{ 
    CGContextSaveGState(ctx); 
    block(); 
    CGContextRestoreGState(ctx); 
} 

使用它這樣的:

CGContextSetFillColorWithColor(context, [UIColor GreenColor].CGColor); 
for (UIBezierPath *path in arrayOfPaths) 
{ 
    CGContextBlock(context, ^{ 
     CGContextAddPath(context, path.CGPath); 
     CGContextFillPath(context); 
    }); 
} 
+0

我不認爲這會工作,因爲我需要做塊顏色是半透明的,在我最初的問題中我忘了提及。這將導致每次形狀被繪製到前一個,因此你不會得到一個平坦的半透明顏色 – reza23