Ich möchte eine UIView in ein Bild konvertieren und in meiner App speichern. Kann mir bitte jemand sagen, wie man einen Screenshot einer Ansicht macht oder sie in ein Bild konvertiert und wie man sie am besten in einer App speichert (keine Kamerarolle)? Hier ist der Code für die Ansicht:
var overView = UIView(frame: CGRectMake(0, 0, self.view.frame.width/1.3, self.view.frame.height/1.3))
overView.center = CGPointMake(CGRectGetMidX(self.view.bounds),
CGRectGetMidY(self.view.bounds)-self.view.frame.height/16);
overView.backgroundColor = UIColor.whiteColor()
self.view.addSubview(overView)
self.view.bringSubviewToFront(overView)
ios
swift
uiview
screenshot
Sameer Hussain
quelle
quelle
Antworten:
Eine Erweiterung
UIView
sollte den Trick machen.Apple rät davon
UIGraphicsBeginImageContext
ab, iOS 10 mit der Einführung des P3-Farbumfangs zu starten.UIGraphicsBeginImageContext
ist nur sRGB und 32-Bit. Sie führten die neueUIGraphicsImageRenderer
API ein, die vollständig farbverwaltet und blockbasiert ist, Unterklassen für PDFs und Bilder enthält und die Kontextlebensdauer automatisch verwaltet. Weitere Informationen finden Sie in der WWDC16-Sitzung 205 (das Rendern von Bildern beginnt um 11:50 Uhr).Verwenden Sie
#available
einen Fallback für frühere Versionen von iOS, um sicherzustellen, dass es auf jedem Gerät funktioniert :quelle
let view = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100)); view.backgroundColor = .black; view.layer.cornerRadius = 9; view.asImage();
Sie können die Erweiterung verwenden
Hier die schnelle 3/4 Version:
quelle
let image = UIImage(view: myView)
UIGraphicsBeginImageContextWithOptions(view.frame.size, false, UIScreen.main.scale)
Konvertieren Sie Ihre UIView in ein Bild mit drawViewHierarchyInRect: afterScreenUpdates: Dies ist um ein Vielfaches schneller als renderInContext
Wichtiger Hinweis: Rufen Sie diese Funktion nicht über viewDidLoad oder viewWillAppear auf. Stellen Sie sicher, dass Sie eine Ansicht erfassen, nachdem sie vollständig angezeigt / geladen wurde
Obj C.
Speichern Sie das bearbeitete Bild Fotoalbum
Swift 3/4
Super einfache Verallgemeinerung mit Erweiterung, iOS11, swift3 / 4
quelle
Unter iOS 10:
quelle
Best Practice ab iOS 10 und Swift 3
Während iOS 9 und frühere Versionen weiterhin unterstützt werden, funktioniert es ab iOS 13, Xcode 11.1, Swift 5.1
Ich bin mir nicht sicher, was die Frage bedeutet:
quelle
quelle
Zum Beispiel, wenn ich eine Ansicht der Größe habe: 50 50 bei 100.100. Ich kann Folgendes verwenden, um einen Screenshot zu machen:
quelle
Meiner Meinung nach ist der Ansatz mit dem Initialisierer nicht so gut, weil er zwei Bilder erzeugt.
Ich bevorzuge das:
quelle
Swift 4.2, iOS 10
Stichprobe
quelle
Dies funktioniert bei mir für Xcode 9 / Swift 3.2 / Swift 4 und Xcode 8 / Swift 3
So verwenden Sie es in einer Funktion:
So machen Sie etwas mit dem von der Funktion zurückgegebenen Bild:
Ich habe die Antwort Xcode 9 / Swift 3.2 / Swift 4 von Paul Hudson erhalten , der uiview in uiimage konvertiert
Ich habe den Xcode 8 / Swift 3 vor langer Zeit von irgendwo auf SO bekommen und habe vergessen, wo :(
quelle
oder in Ziel-c
quelle
Sie können es einfach verwenden, indem Sie die Erweiterung wie folgt verwenden
Wenn Sie diese Erweiterungsmethode / -variablen verwenden möchten, implementieren Sie dies
UIImage-Erweiterung
UIView-Erweiterung
UIApplication-Erweiterung
quelle
oder iOS 10+ können Sie den neuen UIGraphicsImageRenderer + die empfohlene drawHierarchy verwenden, die in einigen Situationen viel schneller sein kann als layer.renderInContext
quelle
Danke @Bao Tuan Diep! Ich möchte eine Ergänzung hinzufügen.
Wenn Sie den Code verwenden:
Sie müssen beachten, dass:
Dann müssen Sie verwenden :
yourView
vorher zu aktualisierenyourView.layer.render(in:UIGraphicsGetCurrentContext()!)
.Andernfalls erhalten Sie möglicherweise ein Bildobjekt, das keine Elemente enthält
quelle
Swift 4.2
quelle
Implementierung in Swift 3 :
Fügen Sie den folgenden Code außerhalb des Klassenbereichs hinzu.
Verwendung :
quelle
Ich habe die Methode von @Naveed J. wie folgt implementiert und sie hat wie ein Zauber funktioniert.
Hier war seine Ausdehnung:
Hier ist, wie ich es implementiert habe.
quelle
Initializer mit dem neuen UIGraphicsImageRenderer seit iOS 10:
quelle
arbeite gut mit mir!
Swift4
quelle
return snapshotImageFromMyView!
Thread 1: Schwerwiegender Fehler: Beim Auspacken eines optionalen Werts wurde unerwartet Null gefundenDie Ansicht enthält eine unscharfe Unteransicht (z. B. die Instanz UIVisualEffectView ), nur drawViewHierarchyInRect: afterScreenUpdates funktioniert.
Die Antwort von @ViJay Avhad ist für diesen Fall richtig.
quelle
quelle