2012-10-29 45 views
2

我想在iPhone上繪製一個圖形,但我希望圖形更新得很快,所以我真正想要繪製的圖形是UIImageView,然後當繪製方法重複,清除舊圖形並重繪它。Draw,Clear然後重繪問題Quartz

這裏是我的代碼:

- (void)redraw { 
    canvas.image = nil; 

    UIGraphicsBeginImageContext(self.view.frame.size); 
    [canvas.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)]; 
    CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound); 
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 5.0); 
    CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 1.0, 0.0, 0.0, 1.0); 
    CGContextBeginPath(UIGraphicsGetCurrentContext()); 
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), 0, canvas.frame.size.height/2); 
    for (float i=0; i<500; i+=0.01) { 
     [self y:i]; 
     CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), ((i*200)-200), (y*200)+canvas.frame.size.height/2); 
    } 
    CGContextStrokePath(UIGraphicsGetCurrentContext()); 
    canvas.image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
} 

此代碼的工作正是我想要它時調用一次。它顯示以下曲線: Working well

但是,當我添加一個計時器到redraw奇怪的東西開始發生。我得到的曲線如上圖所示,當應用程序啓動時,它會立即變成這條曲線(相同的曲線,只是看起來更多地沿x軸延伸,並且在y軸上更高(技術上更低): enter image description here

和:

- (void)y:(float)x { 
    y = sin(x - 1)*pow((x - 1), 0.5)*cos(2*(x - 1))*sin(0.5*(x - 1))*cos(x - 1)*sin(2*(x - 1))*pow(cos(x-1), -1); 
} 
+0

我想知道''我自己:我'正在做什麼以及'y'來自哪裏。 – barley

+0

查看編輯問題... –

+0

對不起,但也許我錯過了一些東西。 ' - (void)y:(float)x'是什麼意思?它沒有返回一個變量,也沒有通過引用傳遞。 'y'是一個實例變量嗎?如果是這樣,我可能會建議你將它改爲'_y'或'y_'來表示它是一個iVar。你在其他地方使用'y' iVar嗎?我只在上面的代碼中看到它使用過一次,在這種情況下,將它作爲iVar是沒有意義的。只需讓'[self y:i]'返回一個'float'值。 –

回答

1

我認爲,問題是,你正在做的canvas.frame你的計算,當你的圖形上下文設置爲self.view.frame.size現在也許都被設置成完全一樣的尺寸。 (我無法知道),但如果出於某種原因,這些大小不同,它可以解釋你的例程的圖形結果中的「拉伸」 。

此外,你有一些奇怪的代碼。在方法開始時,您可以撥打canvas.image = nil;。但稍後(3行),請致電[canvas.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];。如果canvas.image只是設置爲零,那麼drawInRect就沒有圖像(如果您想要替換canvas的圖像,您爲什麼要這麼做?)。

+0

是的,這是問題,謝謝。我使用canvas.image = nil使畫布變爲空白,所以石英線不重疊。有沒有更簡單/更好/更有效的方法? –

+0

假設'canvas'是一個UIImageView,那麼你所需要做的就是將'canvas.image'設置爲你從圖形上下文獲得的新圖像,你不需要先將它設置爲'nil'。當你調用'UIGraphicsBeginImageContext'時,你創建一個新的空的圖形上下文,所以你在這個上下文中繪製的任何東西都是新的(不重疊)。 –