我怎么能欺骗[CALayer renderInContext:]只渲染图层的一部分?

Jor*_*ith 11 iphone objective-c calayer ipad ios

我很清楚除了渲染整个视图和裁剪之外,没有很好的方法将UIView的一小部分渲染到图像中.(像iPad 3这样的产品非常昂贵,产生的图像很大).有关renderInContext方法的说明,请参见此处(没有替代方法).

我想要呈现的视图部分无法预先确定,这意味着我无法将小部分的视图层次结构设置为它自己的UIView(因此也就是CALayer).

我的想法...

我有一个想法,但如果我要成功,我需要一些方向.如果我在UIView(或CALayer)上创建一个类别,该方法添加了以下方法:

[UIView renderSubframe:(CGFrame)frame];
Run Code Online (Sandbox Code Playgroud)

怎么样?好吧,我想如果创建子帧大小的虚拟视图,那么视图可以暂时移动到此.然后虚拟视图的层可以调用renderInContext:,从而获得一种有效且快速的获取视图的方法.

所以...

我真的没有达到CALayer/Quartz核心的速度......这有没有机会工作?如果没有,我可以通过另一种方式实现同​​样的目标 - 我能够实现相同结果的最有效方式是什么(或者其他人已经遇到过这个问题并提出了不同的解决方案)?

Jor*_*ith 27

这是我最后写的类别.由于方便的CGAffineTransform,没有我想象的那么难.

#import "UIView+RenderSubframe.h"
#import <QuartzCore/QuartzCore.h>

@implementation UIView (RenderSubframe)

- (UIImage *) renderWithBounds:(CGRect)frame {

    CGSize imageSize = frame.size;

    UIGraphicsBeginImageContextWithOptions(imageSize, NO, 0.0);
    CGContextRef c = UIGraphicsGetCurrentContext();

    CGContextConcatCTM(c, CGAffineTransformMakeTranslation(-frame.origin.x, -frame.origin.y));
    [self.layer renderInContext:c];

    UIImage *screenshot = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return screenshot;

}

@end
Run Code Online (Sandbox Code Playgroud)