2013-04-04 89 views
2

在我的代碼,我想「動畫」畫線的延遲,因此添加一個新行到視圖後,我打電話setNeedsDisplay - 這一次,工作正常。setNeedsDisplay只被調用一次

在drawRect方法中,繪製線並調用線的方法來增加line-lengthl。現在我想再次調用setNeedsDisplay來重畫這一行 - 所以它得到了一個「增長」的動畫..

但它只調用setNeedsDisplay一次&永遠不會再次,除了我添加另一行。 我也試圖調用一個方法在這個類中,它調用setNeedsDisplay,以確保你不能把它的drawRect內..

- (void)drawRect:(CGRect)rect { 

    for(GameLine *line in _lines) { 

     if(line.done) { 
      CGContextRef c = UIGraphicsGetCurrentContext(); 
      CGContextSetLineWidth(c, 5.0f); 
      CGContextSetStrokeColor(c, lineColor); 

      CGContextBeginPath(c); 
      CGContextMoveToPoint(c, line.startPos.x, line.startPos.y); 
      CGContextAddLineToPoint(c, line.endPos.x, line.endPos.y); 
      CGContextStrokePath(c); 
     }else { 
      CGContextRef c = UIGraphicsGetCurrentContext(); 
      CGContextSetLineWidth(c, 5.0f); 
      CGContextSetStrokeColor(c, delayColor); 

      CGContextBeginPath(c); 
      CGContextMoveToPoint(c, line.delayStartPos.x, line.delayStartPos.y); 
      CGContextAddLineToPoint(c, line.delayEndPos.x, line.delayEndPos.y); 
      CGContextStrokePath(c); 

      [line incrementDelayLine]; 
      [self setNeedsDisplay]; 
     } 
    } 
} 

_lines與GameLine對象的NSMutableArray(非原子,保留)財產。

回答

1

如果你需要一個動畫 - 啓動一個定時器,一旦它發射了 - 調整任何你想要的線路參數,並呼籲setNeedsDisplay

5

它是預期的。

當您調用setNeedsDisplay時,將視圖標記爲需要重繪。好。系統得到它。
而且它將在您的應用的主循環下次運行時完成。

如果你真的想刷新視圖現在電話:

[[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate: [NSDate date]]; 

只是setNeedsDisplay後。

事實上,apple documentation國家(重點煤礦):

當您的視圖更改的實際內容,這是你的責任 到通知您的視圖必須 重繪系統。您可以通過調用您的視圖的setNeedsDisplay或 setNeedsDisplayInRect:視圖的方法來執行此操作。 這些方法讓 系統知道它應該在下一個圖 週期期間更新視圖。因爲等待,直到下一次抽取循環更新 視圖,你可以調用多個視圖這些方法在 同時更新它們。

而且,看到這些所謂的問題:

+0

我添加了一個「NSLog(@」Count:%d「,[_l ines count]);「到for循環之前的drawRect,它會在添加一行之前出現幾次 - 然後再次一次,然後再次沒有次數。 – 2013-04-04 20:32:59

+0

@ Christian'fuzi'Orgler一旦您調用了'setNeedsDisplay',系統將不會考慮任何其他呼叫,直到重新繪製視圖(*即直到您的應用程序主循環運行*)。這是因爲你已經明確了該視圖應該重繪**下一次模態循環運行**。如果您希望每次調用'setNeedsDisplay'時重新繪製視圖,請使用我的答案中提供的代碼。 – Jean 2013-04-04 20:35:54

+0

注意:在'drawRect:'中調用'setNeedsDisplay'會導致循環調用,導致性能很差。 – Jean 2013-04-04 20:41:34