我正在获取UITextView的“快照”作为CGImage,但问题是UITextView的内容非常长(约110k contentSize.height),当我将UITextView层渲染到上下文中时内存使用量变为~130MB,导致应用程序在设备上运行时崩溃。
这是代码。 viewref
是UITextView的一个实例。
UIGraphicsBeginImageContext(self.viewref.contentSize);
CGContextRef ctx = UIGraphicsGetCurrentContext();
//render the text
CALayer *tLayer = self.viewref.layer;
[tLayer renderInContext:ctx];
//get the "snapshot"
CGImageRef imageRef = [UIGraphicsGetImageFromCurrentImageContext() CGImage];
UIGraphicsEndImageContext();
那么,我可以只将部分UITextView图层渲染到图像上下文吗?
答案 0 :(得分:3)
尝试以下内容:(未经测试,但你会得到要点)
CGSize contentSize = self.viewref.contentSize;
CGFloat verticalChunkHeight = 1024.0;
CGFloat verticalOffset = 0.0;
while (verticalOffset < contentSize.height)
{
CGFloat height = fmin(verticalChunkHeight, contentSize.height - verticalOffset);
UIGraphicsBeginImageContext(CGSizeMake(contentSize.width, height));
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextTranslateCTM(ctx, 0.0, -verticalOffset);
CGContentClipToRect(ctx, CGRectMake(0.0, verticalOffset, contentSize.width, height));
CALayer *tLayer = self.viewref.layer;
[tLayer renderInContext:ctx];
CGImageRef imageRef = [UIGraphicsGetImageFromCurrentImageContext() CGImage];
// do something with imageRef
UIGraphicsEndImageContext();
}
答案 1 :(得分:0)
有几种方法可以实现这一目标。 UITextView本身继承自UIScroller,因此您应该能够将边界设置为特定区域并快照该区域(就像它在屏幕上一样)。
您究竟是如何创建CGImage快照的?