2015-06-01 42 views
0

如何反映setNeedsDisplay的UIView更改?繪圖後反映UIView更改

drawRect通過setNeedsDisplay

- (void)drawRect:(CGRect)rect { 
    double i = 0; 
    for(...) 
    //i is incremented 
     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(i * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
       drawStuff(element, context); 
     }); 

例如觸發,每次抽獎將更新後的1S,2S,3S發生,...

DrawStuff切換回主線程與

dispatch_async(dispatch_get_main_queue(), ^(void) { ... 

更新UI時。我已經嘗試了UIBezierPath核心圖形並獲得相同的結果。我也使用UIGraphicsPushContextUIGraphicsPopContext來獲取正確的上下文。

使用NSLog,我可以告訴drawStuff以1s爲增量調用。但是,可見的UIView保持不變。我可以旋轉設備屏幕,這將重新定位UIView並更改其大小。在旋轉時,UIView將反映它當前繪製的內容,但是之後我需要再次旋轉它以在幾秒後看到更新的狀態。

回到上面的問題,是否有電話告訴UIView在setNeedsDisplay之後顯示其當前圖形?謝謝。

回答

1

如果你想確保你的看法是重繪每秒一次,這樣做的正確方法是設置某種形式的計時器在你看來其他地方的,並具有定時功能調用-setNeedsDisplay。反過來,這將作廢您的看法,使你的-drawRect:被調用,它應該做的畫(即調用你drawStuff

概念,-drawRect:應該只是剛剛知道如何做基於實際的繪製工作,一個愚蠢的方法無論目前的狀態如何。您的常規事件邏輯(或計時器)應該(a)根據需要更新狀態,並(b)將視圖標記爲需要重繪。