2013-03-24 88 views
1

爲什麼這段代碼沒有正確執行。我試過setNeedsDisplay和setNeedsLayout,但是這段代碼似乎沒有被執行。即使它執行了,它也會在它不應該執行的時候執行,並且它執行錯誤,這意味着它會在錯誤的位置和隨機的長度中繪製該行。 - (無效)drawNW {如何在正確的時間和地點繪製這條線

NSLog(@"%f",x1); 
NSLog(@"%f",y1); 

CGContextSetStrokeColorWithColor(c, [UIColor blueColor].CGColor); 
CGContextSetLineWidth(c, 10.0); 
CGContextMoveToPoint(c, x1, y1); 
CGContextAddLineToPoint(c, -(sqrtf(2)/2)*length + x1, ((sqrtf(2)/2)*length + y1)); 
CGContextStrokePath(c); 

length = line.bounds.size.height; 

}

長度,X1和Y1被浮子恆定在0.1秒的間隔由一個的NSTimer改變:

NWTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(startMoving) userInfo:nil repeats:YES]; 

定時器呼叫這個調用drawNW的代碼:

x1 = x1-2.5; 
y1 = y1-2.5; 
length= length+5; 
[self drawNW]; 

回答

0

你的鱈魚e繪製東西(CGContext ...等)需要在你的班級drawRect方法中。你的定時器驅動代碼應該改變x1,y1和長度的值,然後調用[self setNeedsDisplay]。這告訴iOS需要重新繪製視圖,然後調用drawRect

至於繪製你想要它們的線條,我無法確切地告訴你要用這個代碼做什麼。

+0

我試過這個,它可以工作,但每次我調用setNeedsDisplay時,它會刪除它剛剛繪製的線條,並用新點(x1,y1)處的線條替換它。無論如何要將這一行存儲在數組或其他東西中。如果沒有,那麼非常感謝 – 2013-03-24 15:06:38

+0

在應用程序啓動時創建一個與您的視圖大小相同的位圖。當每個定時器事件觸發時,更改x1等的值並在該位圖上繪製新行,然後調用[self setNeedsDisplay]。在你的'drawRect'裏面,你只需將這個位圖複製到屏幕上即可。有關代碼,請參見[此答案](http://stackoverflow.com/a/1962986/14606)。 – MusiGenesis 2013-03-24 23:23:00

+0

您也可以將每條新行的座標存儲在某種類型的集合中(如您所建議的),然後在每次'drawRect'調用期間重新繪製整個(擴展)集合,但效率不高並且可能在一會兒。 – MusiGenesis 2013-03-24 23:25:51