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在背景线程上创建黑色背景的主要内容,如果未能解决你的问题,请参考以下文章