2015-06-01 38 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)将视图标记为需要重绘。