Iphone 如何从CALayer中仅获取部分矩形?
我将UITextView的“快照”作为CGImage,但问题是UITextView的内容非常长(约110k contentSize.height),当我将UITextView层渲染到上下文中时,内存使用量将变为130MB,这会导致应用程序在设备上运行时崩溃 这是代码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
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();
}