2012-08-13 51 views
0

我有一個觀點在這裏面-drawRect方法:無效的情況下爲0x0

CGContextRef context = UIGraphicsGetCurrentContext(); 
CGContextSetLineWidth(context, 1.0); 
for (int i=0; i<[points count]; i++) { 
    GraphPoint* point = [points objectAtIndex:i]; 
    [point.color setFill]; 
    [[UIColor blackColor] setStroke]; 
    CGContextBeginPath(context); 
    CGContextAddArc(context, point.x+point.size/2, point.y+point.size/2, point.size, 0, 2*M_PI, 0); 
    CGContextFillPath(context); 
    CGContextStrokePath(context); 
    UIGraphicsPopContext(); 
} 

[points count]等於1,一切正常驚人的,但是,當它增加,引發此錯誤:

Error>: CGContextSetStrokeColorWithColor: invalid context 0x0.

我認爲循環有問題 - 它將上下文的顏色設置了兩次甚至更多次。不知道如何避免它。每個點必須有自己的顏色,我不能在循環之前設置上下文的填充顏色。

請幫忙!也許有人曾經遇到過這個問題?

+1

爲什麼當你不推一個時,你會彈出一個上下文? – 2012-08-13 19:12:50

回答

1

您正在每個循環中彈出上下文,但不會推送它。所以你在上下文堆棧中的上下文用完了。

刪除UIGraphicsPopContext調用,看看它是否修復它。

+0

哦!問題已經解決了! 當上下文的當前顏色和當前點的顏色不同時,我只需要重置上下文顏色! – 2012-08-13 19:15:36

3

您誤解了UIGraphicsPopContext的作用。我假設你正在嘗試清除上下文中設置的當前路徑。你想要CGContextSaveGStateCGContextRestoreGState

試試這個:

CGContextRef context = UIGraphicsGetCurrentContext(); 
CGContextSetLineWidth(context, 1.0); 
for (int i=0; i<[points count]; i++) { 
    CGContextSaveGState(context); 
    { 
     GraphPoint* point = [points objectAtIndex:i]; 
     [point.color setFill]; 
     [[UIColor blackColor] setStroke]; 
     CGContextBeginPath(context); 
     CGContextAddArc(context, point.x+point.size/2, point.y+point.size/2, point.size, 0, 2*M_PI, 0); 
     CGContextFillPath(context); 
     CGContextStrokePath(context); 
    } 
    CGContextRestoreGState(context); 
} 

注:當使用基於堆棧的操作(push和pop)時,我通常會創建一個新的範圍(使用額外的{}),以便檢查它們是否平衡。當然這是可選的。

+0

使用括號和流行風格編程的好方法。 – Cthutu 2012-08-13 19:22:24

+0

感謝您的諮詢!很有用))) – 2012-08-13 19:28:36

相關問題