如何从CALayer中仅获取部分矩形?

时间:2009-07-08 16:45:52

标签: iphone core-graphics calayer

我正在获取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图层渲染到图像上下文吗?

2 个答案:

答案 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快照的?