Die Anwendung verwandelt Bildebene zu renderInContext:
Hintergrund
Bin ich mit Erica Saduns Kochbuch Beispiel aus Kapitel 8, Beispiel 14 — ändern der Größe und Drehen
zu offensichtlich, ändern der Größe und drehen eine UIImageView
.
VIew-Hierarchie
1.) gestreiften hintergrund anzeigen.
2.) der interaktive Blick, der Größe ändern und drehen.
3.) ein overlay-Bild mit einem transparenten Teil. diese Ansicht beginnt die y-Achse bei 128 und ist 768x768.
4.) oben und unten 3, 2 Ansichten 128 in der Höhe.
******Siehe Foto-Beispiel unten****
Problem
Derzeit, ich kann es speichern Sie die gesamte view-Schicht auf die Foto-Bibliothek mit Hilfe [[[self view] layer] renderInContext:
, und #2's Transformationen korrekt sind. Jedoch brauche ich eine Möglichkeit zum speichern einer 768x768 (lime-grün im Foto-Beispiel) Rahmen, der nur beinhaltet #2 und #3, einschließlich #2's-Transformationen. Wenn ich [[#2 layer] renderInContext:
bekomme ich das original Bild, und keine Transformationen. (siehe screenshot unten # - Referenz.
Code
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();
Foto Beispiel
Brauche ich nur den Teil des Bildes skizziert ist in LIME GREEN, wobei die Transformationen durch den Benutzer.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn ich Sie richtig verstehe, das Problem ist, dass Sie Rendern möchten nur layer #2, aber layer #2 transformiert, die nicht beibehalten wird, wenn das Rendern nur diese Ebene? Sie können die Anwendung dieser Transformationen auf das graphics-Kontext CTM (current transformation matrix), bevor Sie Rendern die Ebene, in diesem Kontext. So etwas wie dies funktionieren sollte:
Beachten Sie, dass die Anrufe zu
CGContextSaveGState()
undCGContextRestoreGState()
sind nur notwendig, wenn Sie wollen, ziehen mehr Dinge in dem Zusammenhang, nachdem Sie ziehen Sie die Ebene. Können Sie weglassen, wenn der layer ist alles, was Sie wollen.UIImageView
's.CGContextTranslateCTM(view.frame.origin.x, view.frame.origin.y)
zum einstellen der Gemeinschaftsmarke vor dem zeichnen der view (in dem Fall der layer-2 -, für Sie seineaffineTransform
die CTM nach der übersetzung). Sie können dann ziehen Sie layer #2, gefolgt von Ebene #3 (jeweils mit eigener übersetzung). Beachten Sie, dass Sie möchten, zu speichern und wiederherzustellen die GState um die übersetzungen/rendering.