Ich frage mich, wie meine iPhone-App einen Screenshot eines bestimmten UIView
als erstellen kann UIImage
.
Ich habe diesen Code ausprobiert, aber alles, was ich bekomme, ist ein leeres Bild.
UIGraphicsBeginImageContext(CGSizeMake(320,480));
CGContextRef context = UIGraphicsGetCurrentContext();
[myUIView.layer drawInContext:context];
UIImage *screenShot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
myUIView
hat die Abmessungen 320x480 und einige Unteransichten. Was ist der richtige Weg, um dies zu tun?
ios
objective-c
uiview
screenshot
Ente
quelle
quelle
Antworten:
Ich denke, Sie möchten vielleicht
renderInContext
nichtdrawInContext
. drawInContext ist eher eine Methode, die Sie überschreiben würden ...Beachten Sie, dass es möglicherweise nicht in allen Ansichten funktioniert, insbesondere vor einem Jahr oder so, als ich versuchte, dies mit der Live-Kameraansicht zu verwenden, funktionierte es nicht.
quelle
iOS 7 verfügt über eine neue Methode, mit der Sie eine Ansichtshierarchie in den aktuellen Grafikkontext zeichnen können. Dies kann verwendet werden, um ein UIImage sehr schnell zu erhalten.
Ich habe eine Kategoriemethode implementiert
UIView
, um die Ansicht alsUIImage
:Es ist erheblich schneller als die bestehende
renderInContext:
Methode.Referenz: https://developer.apple.com/library/content/qa/qa1817/_index.html
UPDATE FÜR SWIFT : Eine Erweiterung, die dasselbe tut:
UPDATE FÜR SWIFT 3
quelle
Sie müssen das Schlüsselfenster für einen Screenshot oder eine UIView erfassen. Sie können dies in der Retina-Auflösung mit UIGraphicsBeginImageContextWithOptions tun und den Skalierungsparameter 0.0f festlegen. Es wird immer in nativer Auflösung erfasst (Retina für iPhone 4 und höher).
Dieser macht einen Vollbild-Screenshot (Schlüsselfenster)
Dieser Code erfasst eine UIView in nativer Auflösung
Dadurch wird das UIImage im JPG-Format mit 95% Qualität im Dokumentordner der App gespeichert, falls dies erforderlich ist.
quelle
Ab iOS7 haben wir folgende Standardmethoden:
Das Aufrufen der obigen Methode ist schneller als der Versuch, den Inhalt der aktuellen Ansicht selbst in ein Bitmap-Bild zu rendern.
Wenn Sie einen grafischen Effekt wie z. B. Unschärfe auf einen Schnappschuss anwenden möchten, verwenden Sie
drawViewHierarchyInRect:afterScreenUpdates:
stattdessen die Methode.https://developer.apple.com/library/ios/documentation/uikit/reference/uiview_class/uiview/uiview.html
quelle
Es gibt eine neue API von iOS 10
quelle
Ich habe eine verwendbare Erweiterung für UIView erstellt, um Screenshots in Swift aufzunehmen:
Um es zu benutzen, geben Sie einfach Folgendes ein:
quelle
UIGraphicsBeginImageContextWithOptions(self.bounds.size, false, 0);
anstatt ihnUIGraphicsBeginImageContext(self.bounds.size);
zu verwenden.drawViewHierarchyInRect
anstelle vonrenderInContext
nicht.Diese Methode kann in Ihre Controller-Klasse eingefügt werden.
quelle
drawRect
ist nicht Teil des UIViewController (IIRC). Es ist Teil eines UIView. Ich glaube nicht, dass es aufgerufen wird, wenn es im Controller ist.Apple erlaubt uns jetzt, es in einer öffentlichen Anwendung zu verwenden, obwohl es sich um eine private API handelt
quelle
Einzelheiten
Lösung
Verwendung
Vollständige Probe
Ergebnis
quelle
Apple erlaubt nicht:
Anwendungen sollten einen Screenshot mit der unter http://developer.apple.com/library/ios/#qa/qa2010/qa1703.html
drawRect
angegebenen Methode erstellenquelle
Ich habe diese Erweiterung erstellt, um einen Screenshot von UIView zu speichern
Anruf :
Wenn Sie ein PNG erstellen möchten, muss sich Folgendes ändern:
durch
quelle
Swift 4 aktualisiert:
quelle
Das folgende Snippet wird verwendet, um einen Screenshot aufzunehmen:
Verwenden Sie
renderInContext:
Methode anstelle vondrawInContext:
MethoderenderInContext:
Methode macht den Empfänger und seine Unterschichten in den aktuellen Kontext. Diese Methode wird direkt aus dem Ebenenbaum gerendert.quelle
quelle
Sie können folgende UIView-Kategorie verwenden -
quelle