Aplicación de la capa de image transformada para renderInContext:

Fondo

Estoy usando el ejemplo de Cookbook de Erica Saduns del Chapter 8, Example 14 — Resize and Rotate para cambiar el tamaño y rotar un UIImageView .

Jerarquía VIew

1.) vista de background a rayas.

2.) la vista interactiva que se puede cambiar de tamaño y rotar.

3.) una image superpuesta con una parte transparente. esta vista comienza su eje y en 128 y es 768×768.

4.) arriba y debajo de 3, son 2 vistas de 128 en altura.

****** Ver ejemplo de foto a continuación ****

Problema

Actualmente, puedo save la capa de la vista completa en la fototeca utilizando [[[self view] layer] renderInContext: y las transformaciones de # 2 son correctas. Sin embargo, necesito una forma de save un marco de 768×768 (verde lima en el ejemplo de la foto) que solo incluye los numbers 2 y 3 , incluidas las transformaciones de # 2 . Si utilizo [[#2 layer] renderInContext: obtengo la image original y no hay transformaciones. (vea la captura de pantalla a continuación para # reference.

Código

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

Ejemplo de foto

Solo necesito la parte de la image que se describe en LIME GREEN , a la vez que conservo las transformaciones por parte del usuario.

introduzca la descripción de la imagen aquí

Si te entiendo correctamente, el problema es que quieres representar simplemente la capa # 2, pero la capa # 2 tiene transformaciones que no se conservan al representar solo esa capa. Puede aplicar esas transformaciones a la CTM (matriz de transformación actual) del context de charts antes de representar la capa en ese context. Algo así debería funcionar:

 CGContextRef ctx = UIGraphicsGetCurrentContext(); CGContextSaveGState(ctx); CGContextConcatCTM(ctx, [layer2 affineTransform]); [layer2 renderInContext:ctx]; CGContextRestoreGState(ctx); 

Tenga en count que las llamadas a CGContextSaveGState() y CGContextRestoreGState() solo son necesarias si desea dibujar más cosas en el context después de dibujar la capa. Puede omitirlos si la capa es todo lo que desea.