iOS: Was ist der schnellste und performanteste Weg, um einen Screenshot programmatisch zu erstellen?
in meine iPad-app, ich möchte einen screenshot von einem UIView einen großen Teil des Bildschirms. Leider, die Untersichten sind ziemlich tief verschachtelt, so dauert es zu lange, um den screenshot und animieren einen Seite curling danach.
Gibt es einen schnelleren Weg, als das "üblich"?
UIGraphicsBeginImageContext(self.bounds.size);
[self.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
Wenn möglich, möchte ich vermeiden, caching oder Umstrukturierung meiner Sicht.
InformationsquelleAutor der Frage swalkner | 2011-11-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich habe eine bessere Methode, verwendet die snapshot-API, Wann immer möglich.
Ich hoffe, es hilft.
Wollen Sie mehr wissen über iOS-7-Snapshots?
Objective-C-version:
InformationsquelleAutor der Antwort 3lvis
BEARBEITEN 3. Oktober. 2013
Aktualisiert, um die Unterstützung der neuen super-schnell drawViewHierarchyInRect:afterScreenUpdates: Methode in iOS 7.
Nicht. CALayer ist renderInContext: ist soweit ich weiß der einzige Weg, dies zu tun. Sie können eine Kategorie UIView wie diese, machen es einfacher für sich selbst nach vorne gehen:
UIView+Screenshot.h
UIView+Screenshot.m
Durch diese könnten Sie in der Lage sein zu sagen
[self.view.window imageRepresentation]
in einer view-controller und einen vollständigen screenshot der app. Dies könnte ausschließen, dass der Statusleiste obwohl.EDIT:
Darf ich hinzufügen. Wenn Sie einen UIView mit transparenter Inhalt, und muss ein Bild Darstellung MIT der darunterliegenden Inhalte wie auch, Sie können schnappen Sie sich einen Bild-Darstellung der container-Ansicht und beschneiden Sie das Bild einfach durch die rect-der Untersicht und wandeln Sie auf den container Ansichten Koordinatensystem.
Zuschneiden finden Sie in der Antwort auf diese Frage: Zuschneiden eines UIImage
InformationsquelleAutor der Antwort Trenskow
iOS 7 eingeführt, eine neue Methode, die Sie zum zeichnen einer view-Hierarchie in den aktuellen Grafik-Kontext. Dies kann verwendet werden, um eine
UIImage
sehr schnell.Umgesetzt als Kategorie-Methode auf
UIView
:Es ist wesentlich schneller als die bestehenden
renderInContext:
Methode.UPDATE FÜR SWIFT: Eine Erweiterung, die macht das gleiche:
InformationsquelleAutor der Antwort Klaas
Kombinierte ich die Antworten auf eine einzige Funktion, die ausgeführt wird für alle iOS-Versionen, auch für die retina oder nicht-behält Geräte.
InformationsquelleAutor der Antwort Hemang
Was Sie für Fragen als alternative zum Auslesen der GPU (da der Bildschirm zusammengesetzt, die aus einer beliebigen Anzahl von lichtdurchlässigen views), die von Natur aus langsamer Vorgang zu.
InformationsquelleAutor der Antwort David Dunham
Für mich die Einstellung der InterpolationQuality einen langen Weg gegangen.
Wenn Sie Snapshots sehr detaillierten Bilder, diese Lösung kann nicht akzeptiert werden. Wenn Sie Snapshots text werden Sie kaum den Unterschied bemerken.
Dies reduziert die Zeit, die für Schnappschüsse deutlich machen, ein Bild, das verbraucht viel weniger Speicher.
Dies ist noch vorteilhaft mit der drawViewHierarchyInRect:afterScreenUpdates: Methode.
InformationsquelleAutor der Antwort maxpower