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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了renderInContext在背景线程上创建黑色背景相关的知识,希望对你有一定的参考价值。

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

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

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

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

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

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

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

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

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

答案

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

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

通过强制视图立即呈现自身(使用下面的代码),我可以“同步”所有内容并获得正确的缩略图。

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

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

另一答案

替代方案:

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

以上是关于renderInContext在背景线程上创建黑色背景的主要内容,如果未能解决你的问题,请参考以下文章

将转换后的图像层应用于 renderInContext:

使用 renderInContext 将视图层保存到图像

iOS:renderInContext 和横向方向问题

带有 renderInContext 的 iPad 3 设备崩溃

GTK3 主题对话框在 Audacity 中呈现纯黑色背景

如何将黑色以外的颜色设置为使用 makeTransparent() 创建的图像