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

问题描述 投票:1回答:2

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

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

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

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

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

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

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

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

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

ios multithreading background uiimage render
2个回答
0
投票

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

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

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

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

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


0
投票

替代方案:

UIGraphicsBeginImageContextWithOptions(myview.bounds.size, YES, 0);
[myview drawViewHierarchyInRect:_captureView.bounds afterScreenUpdates:YES];
UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
© www.soinside.com 2019 - 2024. All rights reserved.