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

Iphone 如何从CALayer中仅获取部分矩形?,iphone,core-graphics,calayer,Iphone,Core Graphics,Calayer,我将UITextView的“快照”作为CGImage,但问题是UITextView的内容非常长(约110k contentSize.height),当我将UITextView层渲染到上下文中时,内存使用量将变为130MB,这会导致应用程序在设备上运行时崩溃 这是代码viewref是UITextView的一个实例 UIGraphicsBeginImageContext(self.viewref.contentSize); CGContextRef ctx = UIGraphicsGetCurren

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

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


您是如何创建CGImage快照的?

尝试以下方法:(未经测试,但您会得到要点)

CGSize contentSize=self.viewref.contentSize;
CGFloat垂直块高=1024.0;
CGFloat垂直偏移=0.0;
while(垂直偏移
CGContentCliptRect在任何标题中都找不到。。。你是说CGContextCliptorrect吗?为什么需要翻译?CGContextClipToRect是否放弃传递的rect上的原始值?是的,我指的是CGContextClipToRect。我不记得(从3年前开始!)我为什么要把translate放进去——它可能是试图翻转坐标空间的一部分,但如果是这样,我忘了垂直缩放-1。我发现我还漏掉了一个
verticalOffset+=verticalChunkHeight在while循环的末尾。注意代码块之前的警告!
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();
}