【问题标题】:How can I get only a partial rectangle from a CALayer?如何从 CALayer 中仅获取部分矩形?
【发布时间】:2009-07-08 16:45:51
【问题描述】:

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

【问题讨论】:

    标签: iphone core-graphics calayer


    【解决方案1】:

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

    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();
    }
    

    【讨论】:

    • CGContentClipToRect 在任何标题中都找不到...您的意思是 CGContextClipToRect 吗?
    • 为什么要翻译? CGContextClipToRect 是否丢弃传递的矩形上的原始值?
    • 是的,我的意思是 CGContextClipToRect。我不记得(从 3 年前开始!)为什么我把翻译放进去——它可能是试图翻转坐标空间的一部分,但如果是这样,我忘记了垂直缩放 -1。我看到我在 while 循环结束时也错过了verticalOffset += verticalChunkHeight;。注意代码块之前的警告!
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多