2013-02-01 102 views
0

我不知道爲什麼這個停止工作,但是當我嘗試繪製它的任何部分時,這段代碼會崩潰我的設備。我是新的核心圖形,所以任何指針或建議將是一個很大的幫助。謝謝!石英2D繪圖崩潰

// Style 
CGContextRef context = UIGraphicsGetCurrentContext(); 

// Colors 
CGColorRef fillBox = [UIColor colorWithRed:250.0/255.0 green:250.0/255.0 blue:250.0/255.0 alpha:1.0].CGColor; 
CGColorRef fillBoxShadow = [UIColor colorWithRed:77.0/255.0 green:77.0/255.0 blue:77.0/255.0 alpha:1.0].CGColor; 

CGRect box = CGRectMake(5, 5, self.frame.size.width - 10, self.frame.size.height - 10); 
// Shadow 
CGContextSetShadowWithColor(context, CGSizeMake(0, 0), 1.0, fillBoxShadow); 
CGContextAddRect(context, box); 
CGContextFillPath(context); 
// Box 
CGContextSetFillColorWithColor(context, fillBox); 
CGContextAddRect(context, box); 

CGContextFillPath(context); 

回答

2

如果你的項目使用ARC,那麼這兩條線路可能是你的問題的一部分:

CGColorRef fillBox = [UIColor colorWithRed:250.0/255.0 green:250.0/255.0 blue:250.0/255.0 alpha:1.0].CGColor; 
CGColorRef fillBoxShadow = [UIColor colorWithRed:77.0/255.0 green:77.0/255.0 blue:77.0/255.0 alpha:1.0].CGColor; 

ARC被釋放UIColor對象和CGColorRef。您需要保留CGColorRef,然後在完成後釋放它。

我會寫的代碼是這樣的:

UIColor *fillBox = [UIColor colorWithRed:250.0/255.0 green:250.0/255.0 blue:250.0/255.0 alpha:1.0]; 
UIColor *fillBoxShadow = [UIColor colorWithRed:77.0/255.0 green:77.0/255.0 blue:77.0/255.0 alpha:1.0]; 

,然後在方法以後使用fillBox.CGColor和fillBoxShadow.CGColor。

+0

它不是立即釋放,而是在runloop結束時:'colorWithRed ...'是一個返回自動釋放對象的工廠方法。它們在'@ autorelease'塊的末尾釋放,或者在runloop迭代之後釋放。所以這不是問題來自何處。 – Cyrille

+0

請注意不同。 ARC將在'CGRect box = CGRectMake(...);'代碼之前釋放UIColor對象。我在將一個現有項目轉換成許多月前的ARC時遇到了這個問題...... – JuliusO

+0

負面影響。剛剛嘗試了我的一段代碼:'CGColorRef white = [UIColor whiteColor] .CGColor; CGContextClearRect(ctx,rect); CGContextSetFillColorWithColor(ctx,white); CGContextAddPath(ctx,_bezier.CGPath); CGContextFillPath(ctx);'它在ARC中完美運行。 – Cyrille

0

而不是做的

CGContextAddRect(context, box); 
CGContextFillPath(context); 

嘗試使用CGContextFillRect

您無法預先填充您尚未添加到上下文的路徑。

注意:你可以做

CGContextAddPath(context, [UIBezierPath pathWithRect:box].CGPath); 
CGContextFillPath(context); 

但是這是一個有點矯枉過正相比,只是填充一個矩形。

(不知道的pathWithRect:語法,但它的存在。)

+0

'CGContextAddRect'將矩形添加到上下文的當前路徑。這兩種做法是等同的。不過,我同意'CGContextFillRect'更簡單,因此在沒有任何其他東西需要在同一個填充中繪製時更好。 –