renderInContext在背景线程上创建黑色背景

时间:2014-05-08 15:11:27

标签: ios multithreading background uiimage render

我使用renderInContext绘制视图,以创建核心数据存储的屏幕截图。

我正在使用这个'标准'代码...

UIGraphicsBeginImageContextWithOptions( myview.bounds.size, YES, 0 );

CGContextRef ctx = UIGraphicsGetCurrentContext();
[myview.layer renderInContext:ctx];

UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

最初,我在主线程上做了这个,工作得很好。但是,随着视图及其子视图变得更加复杂(可能有数百个带有自己绘制例程的子视图),UI变得太慢了。所以,我将渲染移动到后台线程中。

除了视图的背景颜色' myview'是黑色的,这不是我把它设置为......白色。

通过实验,我注意到如果我暂停我的背景线程一两秒,渲染就完成了,我的背景是所需的颜色。这是好的,但随着视图变得越来越复杂,暂停需要更长才能获得正确的视图图像,并且我需要的时间延迟并不正确'向上'随着视图变得更加复杂。

有没有人有任何建议如何解决?

2 个答案:

答案 0 :(得分:0)

出于信息目的,我设法解决了这个问题。

当我需要在后台渲染时,我正在以编程方式重新创建我的视图及其子视图,但是当我调用setNeedsDisplay时,主视图并没有立即调用drawRect ...(当然!)。所以我的后台线程有时会在主视图呈现之前运行。

通过强制视图立即呈现自身(使用下面的代码),我可以同步'一切都得到正确的缩略图。

CALayer *layer = self.layer;
[layer setNeedsDisplay];
[layer displayIfNeeded];

希望这有助于其他任何人。

答案 1 :(得分:0)

替代:

UIGraphicsBeginImageContextWithOptions(myview.bounds.size, YES, 0);
[myview drawViewHierarchyInRect:_captureView.bounds afterScreenUpdates:YES];
UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();