4

我将 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 层的一部分渲染到图像上下文吗?

4

2 回答 2

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();
}
于 2009-07-16T12:09:25.263 回答
0

有几种方法可以做到这一点。UITextView 本身继承自 UIScroller,因此您应该能够将边界设置为特定区域并仅对该区域进行快照(就像它在屏幕上一样)。

您究竟是如何创建 CGImage 快照的?

于 2009-07-08T22:15:23.773 回答