将变换后的图像层应用于renderInContext:

Wri*_*sCS 10 core-graphics layer calayer ipad ios

背景

我正在使用Erica Saduns Cookbook示例Chapter 8, Example 14 — Resize and Rotate来显然调整大小并旋转一个UIImageView.

等级制度

1.)条纹背景视图.

2.)可以调整大小和旋转的交互式视图.

3.)具有透明部分的叠加图像.此视图在128处开始y轴,为768x768.

4.)上方和下方3,高度为2视图128.

******见下面的照片示例****

问题

目前,我可以将整个视图的图层保存到照片库中[[[self view] layer] renderInContext:,并且#2的转换是正确的.但是,我需要一种方法来保存768x768 (照片示例中的浅绿色)框架,其中仅包括#2#3,包括#2的转换.如果我使用[[#2 layer] renderInContext:,我会得到原始图像,而不是转换.(参见下面的#参考屏幕截图.

CGSize deviceSpec;
if ( IDIOM == IPAD ) { deviceSpec =CGSizeMake(768,768); } else { deviceSpec =CGSizeMake(320,480); }
if (  scale > 1.5  ) {
    UIGraphicsBeginImageContextWithOptions(deviceSpec, NO, scale);
} else {
    UIGraphicsBeginImageContext( deviceSpec );
}        

    CGContextRef ctx = UIGraphicsGetCurrentContext();      

    [[stripedBg layer] renderInContext:ctx];  //#1    

        CGContextSaveGState(ctx);

            CGContextConcatCTM(ctx, [[interactiveImage layer] affineTransform]);

            //CGContextTranslateCTM(ctx, interactiveImage.frame.origin.x,interactiveImage.frame.origin.y-128);

            [[interactiveImage layer] renderInContext:ctx]; // #2

        CGContextRestoreGState(ctx);

    [[overlayImage layer] renderInContext:ctx]; // #3

    UIImage * draft = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();
Run Code Online (Sandbox Code Playgroud)

照片示例

我只需要LIME GREEN中概述的图像部分,同时保留用户的变换.

在此输入图像描述

Lil*_*ard 17

如果我理解正确,问题是您只想渲染第2层,但第2层是否只有在渲染该层时才会保留的变换?在将图层渲染到该上下文之前,可以将这些变换应用于图形上下文的CTM(当前变换矩阵).这样的事情应该有效:

CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextSaveGState(ctx);
CGContextConcatCTM(ctx, [layer2 affineTransform]);
[layer2 renderInContext:ctx];
CGContextRestoreGState(ctx);
Run Code Online (Sandbox Code Playgroud)

注意,只有在绘制图层后想要在上下文中绘制更多内容时才需要调用CGContextSaveGState()CGContextRestoreGState().如果图层是您想要的,您可以省略它们.