相关疑难解决方法(0)

有没有办法让drawRect现在正常工作?

原来的问题...............................................

如果您是drawRect的高级用户,您将知道当然"drawRect"在"所有处理完成"之前不会实际运行.

setNeedsDisplay将视图标记为无效和操作系统,并且基本上等待所有处理完成.在您想要拥有的常见情况下,这可能会令人愤怒:

  • 视图控制器1
  • 开始一些功能2
  • 逐渐增加3
    • 创造了一个越来越复杂的艺术品和4
    • 在每一步,你setNeedsDisplay(错!)5
  • 直到所有工作完成6

当然,当你执行上面的1-6时,所有发生的事情是drawRect 在步骤6之后运行一次.

您的目标是在第5点刷新视图.怎么办?


解决原始问题............................................. .

总之,您可以(A)背景大画,并调用前景进行UI更新或(B)可争议地有四种"即时"方法建议不使用后台进程.为了起作用的结果,运行演示程序.它有所有五种方法的#defines.


Tom Swift介绍的真正令人震惊的替代解决方案..................

汤姆斯威夫特解释了非常简单地操纵运行循环的惊人想法.以下是触发运行循环的方法:

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

这是一个真正令人惊叹的工程.当然,在操作运行循环时应​​该非常小心,并且许多人指出这种方法严格适用于专家.


引起的奇怪问题............................................. .

尽管许多方法都有效,但实际上并没有"工作",因为在演示中你会看到一个奇怪的渐进式减速神器.

滚动到我在下面粘贴的"答案",显示控制台输出 - 您可以看到它逐渐减慢的速度.

这是新的SO问题:
运行循环/ drawRect中的神秘"渐进式减速"问题

这是演示应用程序的V2 ...
http://www.fileswap.com/dl/p8lU3gAi/stepwiseDrawingV2.zip.html

你会看到它测试所有五种方法,

#ifdef TOMSWIFTMETHOD
 [self setNeedsDisplay];
 [[NSRunLoop currentRunLoop]
      runMode:NSDefaultRunLoopMode beforeDate:[NSDate date]];
#endif
#ifdef HOTPAW
 [self setNeedsDisplay];
 [CATransaction flush];
#endif
#ifdef LLOYDMETHOD
 [CATransaction begin];
 [self setNeedsDisplay];
 [CATransaction commit];
#endif
#ifdef DDLONG
 [self setNeedsDisplay];
 [[self layer] displayIfNeeded];
#endif …
Run Code Online (Sandbox Code Playgroud)

iphone cocoa quartz-graphics runloop ios

44
推荐指数
4
解决办法
2万
查看次数

运行循环/ drawRect中的神秘"渐进式减速"问题

这是一个真正的谜.

想象一下,您正在进行在屏幕外绘制复杂图像的传统过程(CGLayer),并且您在绘制时间歇性地将图像更新到屏幕上.

如您所知,执行此操作的方法是:在后台运行大型绘图过程,并根据需要调用setNeedsDisplays的前景,从而更新图像.这是微不足道的,可以通过两行代码实现.

但是,当你这样做时,会出现一个神秘的问题:每个绘图周期所花费的时间,每次都会增加,变得无法使用.此外,时间可能不规律地变化.

这是一个已知的iOS错误,还是?谁看过这个吗?

这是一个非常简单,非常容易理解的应用程序,可以解决问题:

http://www.fileswap.com/dl/p8lU3gAi/stepwiseDrawingV2.zip.html

输出示例如下.

有谁知道为什么会这样?操作系统的行为非常奇怪.

后来 ...... FELZ已经找到了令人震惊的解决方案.Felz副本的CGLayer一次每一轮.这完全阻止了这种奇怪的行为.

然而,对于究竟发生了什么仍然没有真正清楚的理解:因此从字面上看,当奇怪的问题出现时,时间在哪里?

这是一个很长的输出示例......

请注意,您有时会得到一个"双重奇异"的结果,如下所示:它表现出"正常"奇怪的行为:每次都会增加时间.然而,偶尔会有几轮时间"非常快",然后返回.怪啊?此外,如果您在模拟器上运行,请快速单击Mac上不相关的应用程序,以获得"更奇怪"的结果.

尽管费尔兹给出了一个完美的工作答案,但实际的机制仍然是一个谜.

:26:56.697 stepwiseDrawing[5334:1a03] time difference was     0
:26:56.707 stepwiseDrawing[5334:1a03] time difference was    10
:26:56.717 stepwiseDrawing[5334:1a03] time difference was    10
:26:56.744 stepwiseDrawing[5334:1a03] time difference was    27
:26:56.771 stepwiseDrawing[5334:1a03] time difference was    27
:26:56.807 stepwiseDrawing[5334:1a03] time difference was    37
:26:56.829 stepwiseDrawing[5334:1a03] time difference was    22
:26:56.864 stepwiseDrawing[5334:1a03] time difference was    35
:26:56.891 stepwiseDrawing[5334:1a03] time difference was    28
:26:56.936 stepwiseDrawing[5334:1a03] time difference was    45 …
Run Code Online (Sandbox Code Playgroud)

iphone cocoa drawrect ios

7
推荐指数
1
解决办法
1944
查看次数

标签 统计

cocoa ×2

ios ×2

iphone ×2

drawrect ×1

quartz-graphics ×1

runloop ×1