【问题标题】:Reflecting UIView changes after drawing绘制后反映 UIView 的变化
【发布时间】:2015-06-01 06:18:51
【问题描述】:

如何反映 setNeedsDisplay 的 UIView 更改?

drawRectsetNeedsDisplay触发

- (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 时。我已经尝试了UIBezierPathCore Graphics 并得到了相同的结果。我还使用UIGraphicsPushContextUIGraphicsPopContext 来获取正确的上下文。

使用 NSLog,我可以知道 drawStuff 是以 1s 为增量调用的。但是,可见的 UIView 保持不变。我可以旋转设备屏幕,这将重新定位 UIView 并更改其大小。旋转时,UIView 将反映它当前绘制的内容,但我需要再次旋转它才能在几秒钟后看到更新的状态。

回到上面的问题,是否有调用告诉 UIView 在setNeedsDisplay 之后显示其当前图形?谢谢。

【问题讨论】:

    标签: ios objective-c iphone uiview uibezierpath


    【解决方案1】:

    如果您试图确保您的视图每秒重绘一次,正确的做法是在视图中设置某种形式的计时器elsewhere,并让计时器函数调用@ 987654321@。这反过来会使您的视图无效并导致您的-drawRect: 被调用,这应该进行绘图(即调用您的drawStuff

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

    【讨论】:

      猜你喜欢
      • 2018-08-04
      • 2018-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-01
      • 2014-12-07
      • 1970-01-01
      相关资源
      最近更新 更多