绘制后反映UIView的变化

时间:2015-06-01 06:18:52

标签: ios objective-c iphone uiview uibezierpath

如何反映setNeedsDisplay

的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 个答案:

答案 0 :(得分:1)

如果您尝试确保每秒重绘一次视图,正确的方法是在视图中设置某种形式的计时器其他,并使用timer函数调用{ {1}}。这将反过来使您的视图无效并导致您-setNeedsDisplay被调用,这应该进行绘制(即调用您的-drawRect:

从概念上讲,drawStuff应该只是一个愚蠢的方法,只知道如何根据视图的当前状态进行实际绘图工作。您之外的正常事件逻辑(或计时器)应该(a)根据需要更新状态,并(b)将视图标记为需要重绘。