Ios 将变换的图像层应用于renderInContext: 背景
我正在使用Erica Saduns的烹饪书示例来调整和旋转Ios 将变换的图像层应用于renderInContext: 背景,ios,ipad,core-graphics,calayer,layer,Ios,Ipad,Core Graphics,Calayer,Layer,我正在使用Erica Saduns的烹饪书示例来调整和旋转UIImageView 视图层次结构 1.)条带化背景视图 2.)可调整大小和旋转的交互式视图 3.)具有透明部分的覆盖图像。此视图的y轴从128开始,为768x768 4.)在3上方和下方,有2个高度为128的视图 ******见下面的照片示例**** 问题 目前,我可以使用[[[self view]layer]renderInContext:将整个视图层保存到照片库,并且#2的转换是正确的。但是,我需要一种方法来保存768x768(照
UIImageView
视图层次结构
1.)条带化背景视图
2.)可调整大小和旋转的交互式视图
3.)具有透明部分的覆盖图像。此视图的y轴从128开始,为768x768
4.)在3上方和下方,有2个高度为128的视图
******见下面的照片示例****
问题
目前,我可以使用[[[self view]layer]renderInContext:
将整个视图层保存到照片库,并且#2的转换是正确的。但是,我需要一种方法来保存768x768(照片示例中为淡绿色)仅包含#2和#3的帧,包括#2的转换。如果我使用[[2层]renderContext:
,我会得到原始图像,而不会转换。(请参见下面的屏幕截图以获取参考。)
代码
照片示例
我只需要石灰绿中勾勒出的图像部分,同时保留用户的变换
如果我理解正确,问题是您只想渲染第2层,但第2层在渲染该层时没有保留变换?您可以将这些变换应用到图形上下文的CTM(当前变换矩阵)在将层渲染到该上下文中之前。类似的操作应该可以:
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextSaveGState(ctx);
CGContextConcatCTM(ctx, [layer2 affineTransform]);
[layer2 renderInContext:ctx];
CGContextRestoreGState(ctx);
注意,对
CGContextSaveGState()
和CGContextRestoreGState()的调用
仅在绘制层后,如果您想在上下文中绘制更多内容,则必须使用它们。如果层是您想要的,则可以忽略它们。我需要能够仅包含#2和#3,这是两个不同的UIImageView
。@WrightsCS:3不是#2的子视图吗?如果不是,您可以在绘制后将#3渲染到上下文中endered#2.您必须应用自己的仿射变换来设置每个层的上下文原点。每个层都是主视图的子视图,没有一个是其他层的子视图。@WrightsCS:您可以再次使用CTM。只需使用cgContextTranslateCm(view.frame.origin.x,view.frame.origin.y)
在绘制视图之前调整CTM(对于第2层,在进行转换后将其仿射变换应用于CTM)。然后可以绘制第2层,然后绘制第3层(每个层都有自己的转换)。请注意,您将希望保存和恢复平移/渲染周围的GState。因此,如果转换#2,我将如何计算它的x和y,因为它们应随每次旋转/调整大小而改变,我理解正确吗?
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextSaveGState(ctx);
CGContextConcatCTM(ctx, [layer2 affineTransform]);
[layer2 renderInContext:ctx];
CGContextRestoreGState(ctx);